메인 콘텐츠로 건너뛰기
인증 기능은 새로 출시되었습니다. 이 페이지의 모든 호출은 최종 사용자 자격 증명을 사용하거나 아무 자격 증명도 사용하지 않습니다. 인증 API 키나 콘솔 token을 이 endpoint로 절대 보내지 마십시오.
각 애플리케이션은 고유한 OpenID Connect 발급자(issuer)입니다. 발급자는 애플리케이션의 로그인 출처입니다.
  • 라이브 애플리케이션: https://<name>.auth.didit.me
  • 샌드박스 애플리케이션: https://<name>.sandbox.auth.didit.me
  • 또는 활성화된 후의 사용자 지정 도메인
라이브와 샌드박스는 별도의 발급자이며 키도 각각 다릅니다. DIDIT_AUTH_ISSUER에는 끝에 슬래시가 없는 발급자를, DIDIT_APPLICATION_ID에는 애플리케이션 ID를 설정하십시오. 토큰에는 애플리케이션 ID가 aud로 포함됩니다. 게시용 키에는 발급자가 인코딩되어 있습니다. pk_live_ 또는 pk_test_ 뒤의 값은 패딩이 없는 base64url로 인코딩된 발급자입니다.
사용자 지정 도메인이 활성화되면 기본 호스트 대신 이 도메인이 발급자가 됩니다. 새 token의 iss에는 이 도메인이 표시되고, discovery의 jwks_uri도 이 도메인을 가리키며, 게시용 키도 변경됩니다. 기본 호스트로 발급된 액세스 token은 갱신되기 전까지 GET /session/에서 실패합니다. 도메인을 활성화할 때 DIDIT_AUTH_ISSUER를 업데이트하거나, 이전 token이 만료될 때까지(최대 5분) 두 발급자를 모두 허용하십시오.
이 페이지의 서버 endpoint(discovery, 키, token, 세션)는 인증 API 참조에 있으며, openapi-authentication.json에서 생성됩니다. 호스팅 로그인 페이지는 여기에 포함되지 않습니다.

디스커버리 및 키

발급자는 다음을 지원합니다.
  • 응답 유형 code, 응답 모드 query.
  • 권한 부여 유형 authorization_code 및 refresh_token.
  • PKCE 방식은 S256만 지원합니다. 클라이언트는 공개 클라이언트입니다. 클라이언트 시크릿은 없으며, client_id는 애플리케이션 ID입니다.
  • 서명 알고리즘 ES256(P-256 키).
  • 스코프 openid, email, phone, profile, offline_access.
userinfo, introspection, end-session endpoint는 없으며, prompt=none은 지원되지 않습니다. 세션을 읽고 확인하려면 GET /session/을 사용하십시오.

캐싱과 교체

두 문서 모두 Cache-Control: public, max-age=300으로 응답하므로, 여러분과 공유 캐시는 5분 동안 이를 보관할 수 있습니다. IP 주소당 분당 1,200회, 시간당 12,000회의 요청을 허용합니다. 이 한도는 로그인 endpoint보다 훨씬 높습니다. 많은 백엔드 인스턴스가 보통 하나의 주소를 공유하기 때문입니다.
  • 각 키에는 kid가 있으며, 새 키 ID는 k_로 시작합니다. 모든 token은 kid 헤더에 자신의 키를 명시합니다.
  • 키는 30일마다 교체됩니다. Didit은 다음 키가 서명을 시작하기 하루 전에 공개하고, 이전 키는 서명을 중단한 뒤에도 하루 동안 계속 공개합니다. 따라서 5분 동안 캐시된 JWKS는 교체 시점에도 계속 검증에 사용할 수 있습니다.
  • kid로 키를 캐시하십시오. token이 명시한 kid를 보유하고 있지 않으면 JWKS를 다시 가져오되, 최대 1분에 한 번만 가져오십시오. 그래도 키가 없으면 token을 거부하십시오.
  • Didit이 노출된 키를 폐기하면 JWKS에서 해당 키를 즉시 제거하며, GET /session/은 그 키가 서명한 모든 token을 거부합니다. 대체 키는 하루 전 공개 없이 즉시 서명을 시작합니다. 최대 5분 전에 캐시된 JWKS는 여전히 폐기된 키를 허용하고 대체 키는 아직 알지 못합니다. 따라서 캐시가 갱신되기 전까지 새 token이 오프라인 검증에 실패할 수 있습니다.

로그인 시작

호스팅 페이지를 여십시오. 이 페이지는 authorization_endpoint입니다.
빠른 시작 가이드에서 이 요청을 대신 구성해 줍니다.

코드 교환

콜백은 code와 state를 받습니다. state를 확인한 다음 60초 안에 코드를 교환하십시오. 각 코드는 한 번만 사용할 수 있습니다. 본문은 JSON 또는 폼 인코딩일 수 있습니다.
expires_in은 액세스 token이 남은 유효 시간을 초 단위로 나타냅니다. 다중 세션을 끄면 이 교환으로 해당 사용자의 다른 세션이 종료됩니다.

액세스 토큰 클레임

액세스 토큰은 alg: ES256과 typ: at+jwt 헤더를 가진 JWT입니다. 유효 기간은 최대 5분이며, 세션의 남은 기간을 넘지 않습니다. ID 토큰의 헤더는 typ: JWT입니다. 액세스 토큰과 같은 클레임을 담지만 client_id는 제외합니다. 대신 auth_time과 email_verified를 포함하며, 값이 있으면 email, name, phone_number도 포함합니다. 코드 교환으로 받은 ID 토큰에만 nonce가 들어 있으며, 이는 로그인 요청에 값이 있었을 때에만 해당합니다. 리프레시로 받은 ID 토큰에는 이것이 절대 들어 있지 않으므로, 확인은 코드 교환 시점의 ID 토큰에서 하십시오. ID 토큰을 액세스 토큰으로 받아들이면 안 됩니다.

서버에서 토큰 검증

클레임을 신뢰하기 전에 다음을 모두 확인해야 합니다.
  1. alg는 ES256이고 typ는 at+jwt여야 합니다. none을 포함해 그 밖의 알고리즘은 모두 거부합니다.
  2. kid가 애플리케이션의 JWKS에 있어야 하고, 서명이 검증되어야 합니다.
  3. iss가 설정된 발급자와 같아야 하고, aud가 애플리케이션 ID와 같아야 합니다.
  4. exp와 iat이 유효해야 합니다. 시계 차이는 최대 60초까지 허용합니다. sub, sid, jti가 있어야 합니다.
  5. act는 null이어야 합니다. AI 에이전트의 액세스 토큰도 같은 키로 서명되며 같은 typ, iss, aud를 갖습니다. 이를 구분하는 것은 act뿐입니다. 엔드포인트가 에이전트를 허용하지 않으면 해당 토큰을 거부합니다. 허용하는 경우에는 act.scopes가 부여한 범위만 허용합니다. GET /session/은 에이전트 토큰을 항상 거부합니다.
발급자는 토큰이 아니라 설정에서 가져와야 합니다.
오프라인 검증으로는 방금 종료된 세션을 확인할 수 없습니다. 이것이 문제가 되는 경우, 예를 들어 지급 처리 전에는 GET /session/을 호출하십시오.

세션 확인

응답에는 sub, sid, application_id, vendor_data, amr, mfa_verified, email, email_verified, phone, verified_identity, verified, expires_at, post_logout_redirect_uri, organizations가 포함됩니다. 각 조직 항목에는 organization_id, organization__name, role, custom_role이 있습니다. 이 확인은 오프라인 검증보다 엄격합니다. 세션이 취소되었거나, 유휴 상태가 되었거나, 유효 기간이 지났거나, 사용자가 차단되었거나, 이메일 인증이 더 이상 유효하지 않거나, 세션이 더 이상 MFA 정책을 충족하지 않거나(예: 사용자가 인증 앱을 추가했거나 조직 관리자가 된 경우), 토큰이 리프레시로 교체된 경우에도 실패합니다. 실패하면 WWW-Authenticate: Bearer 헤더와 함께 401 {"detail": "invalid_token"}을 반환합니다. GET /session/은 IP 주소당 분당 30회, 시간당 300회까지 요청할 수 있으며, 이 한도는 DELETE /session/과 공유됩니다. 토큰은 매 요청마다 오프라인으로 검증하고, 이 호출은 꼭 필요한 순간에만 사용하십시오. 성공한 호출은 활동으로 집계되므로 세션의 idle_timeout이 다시 시작됩니다. 이메일 인증은 신원 인증이 아닙니다. 신원 인증 여부는 verified로 확인합니다. 신원 인증이 없으면 여기서는 null이지만, 토큰에는 {}가 들어 있습니다.

리프레시 토큰

리프레시하면 새 액세스 토큰, ID 토큰, 리프레시 토큰이 발급되며, 보낸 리프레시 토큰은 더 이상 작동하지 않습니다.
  • 리프레시 토큰은 무작위 문자열이며, 세션이 끝날 때까지 유효합니다.
  • 재사용하면 세션이 종료됩니다. 이미 사용된 리프레시 토큰이 다시 들어오면 Didit은 이를 토큰 도용의 신호로 보고 세션을 취소하며 400 {"error": "invalid_grant"}를 반환합니다. 세션의 토큰은 모두 작동을 멈춥니다. 이전 리프레시로 받은 토큰도 포함됩니다. 이들의 리프레시 토큰은 실패하고, 액세스 토큰은 GET /session/에서 즉시 실패합니다. 다만 오프라인 검증은 만료될 때까지, 최대 5분 동안 여전히 통과합니다.
  • 세션마다 한 번에 하나의 리프레시만 실행하십시오. 탭, 기기, 서버 인스턴스가 여러 개여도 마찬가지입니다. 세 가지 토큰은 함께 교체해야 합니다.
  • 리프레시가 400으로 실패하거나 응답이 없으면 다시 로그인을 시작하십시오. 무조건 재시도하지 마십시오. 리프레시가 실제로 성공한 뒤의 재시도는 재사용이 됩니다.
  • 503 {"error": "temporarily_unavailable"}는 리프레시가 수행되지 않았다는 뜻이며, 리프레시 토큰은 여전히 유효합니다. 백오프를 두고 재시도하십시오.
  • Didit은 리프레시를 실행하기 전에 429를 반환합니다. 따라서 Retry-After만큼 기다린 뒤 재시도하십시오. 토큰 엔드포인트는 IP 주소당 분당 30회, 시간당 300회까지 허용합니다. 이에 더해, 애플리케이션의 모든 POST와 DELETE는 봇 방지 버킷을 공유합니다. 이 엔드포인트들을 합쳐 IP 주소당 분당 60회, 기기당 분당 30회입니다. 애플리케이션 전체로는 리프레시에 분당 6,000회 버킷이 있고, 그 밖의 모든 POST와 DELETE(브라우저와 로그인 단계 포함)에는 분당 3,000회 버킷이 있습니다. 따라서 리프레시가 로그인 한도를 소진하지 않습니다.
  • 액세스 토큰이 5분이면, 시간당 300회의 리프레시로 활동 중인 사용자 약 25명을 감당할 수 있습니다. 서버 한 곳의 IP 주소에서 많은 사용자를 리프레시한다면, 요청에 새 토큰이 필요할 때에만 리프레시하고, 가능하면 브라우저나 앱에서 리프레시하십시오.

로그아웃

현재 사용자의 액세스 토큰과 함께 DELETE /session/을 호출하면 세션이 종료되고 204가 반환됩니다. 해당 리프레시 토큰은 더 이상 작동하지 않으며, 액세스 토큰은 즉시 GET /session/에서 실패합니다. 오프라인으로 검증한 토큰은 만료될 때까지 계속 유효합니다. 그런 다음 post_logout_redirect_uri를 설정했다면 사용자를 해당 주소로 이동시킵니다. 로그아웃에는 GET /session/이 허용하는 액세스 토큰이 필요합니다. 즉, 만료되지 않았고 리프레시로 교체되지 않은 토큰이어야 합니다. 401이 반환되면 세션이 종료되지 않은 것입니다. 이 경우 토큰을 새로 고친 뒤 새 액세스 토큰으로 로그아웃하십시오. 리프레시가 400으로 실패하면 해당 세션은 더 이상 사용할 수 없습니다. 다음 경우에도 세션이 종료됩니다.
  • session_lifetime(기본값 30일) 또는 idle_timeout(기본값 1일)을 초과한 경우,
  • 여러 세션 허용이 꺼진 상태에서 사용자가 다시 로그인한 경우,
  • revoke_on_password_change가 켜져 있는 상태에서 사용자가 비밀번호를 재설정한 경우,
  • 귀하의 팀이 콘솔에서 세션을 취소하거나 사용자를 차단한 경우,
  • 이미 사용된 리프레시 토큰이 다시 전송된 경우.

수명

목적에 따른 자격 증명 저장

  • 인증 API 키와 콘솔 토큰은 서버에 보관하십시오.
  • 브라우저 액세스 토큰은 가능한 한 메모리에 보관하십시오. 서버 렌더링 앱의 경우 보안 HttpOnly 쿠키를 사용하고, 쿠키로 인증된 요청은 CSRF에 대비하여 보호하십시오.
  • 모바일 리프레시 토큰은 플랫폼이 보호하는 저장소에 보관하십시오. 로그아웃 후에는 로컬 상태를 삭제하십시오.
  • 토큰을 URL이나 로그에 절대 포함하지 마십시오.
다음으로 JavaScript 퀵스타트, Next.js 퀵스타트 또는 인증 API 레퍼런스를 진행하십시오.
마지막 수정일 2026년 11월 7일