ID 토큰

ID 토큰 (ID Token)

OAuth 2.0만으로는 인가된 접근 권한은 얻을 수 있지만 "지금 로그인한 사람이 실제로 누구인지"는 알 수 없어요. OpenID Connect가 여기에 더하는 핵심 데이터 구조가 바로 **ID 토큰(ID Token)**이에요. 이 토큰은 사용자가 인증되었다는 사실과 함께 요청한 다른 클레임들을 담아, 형상상으로는 **JWT(JSON Web Token)**로 표현되지요. 이 글에서는 ID 토큰이 어떤 클레임들로 이루어지고, 어떻게 서명·검증되는지 살펴볼게요.

출처: OpenID Connect Core 1.0 — 2. ID Token

본문

ID 토큰이란

ID 토큰은 클라이언트(앱)를 사용할 때 인가 서버(Authorization Server)가 최종 사용자(End-User)의 인증에 대한 클레임을 담아 발급하는 보안 토큰이에요. 필요하면 다른 요청된 클레임도 함께 담을 수 있고, 항상 JWT 형태로 표현돼요.

모든 흐름에서 공통으로 쓰는 ID 토큰 클레임

아래 클레임들은 OpenID Connect가 쓰는 모든 OAuth 2.0 흐름에서 ID 토큰에 들어가요.

클레임 필수 여부 설명
iss REQUIRED 응답 발급자(Issuer)의 식별자. https 스킴을 쓰는 대소문자 구분 URL이며, 쿼리나 프래그먼트는 없어요.
sub REQUIRED 주체 식별자(Subject Identifier). 발급자 내에서 로컬하게 유일하고 재사용되지 않는 값이에요. 255 ASCII 문자를 넘으면 안 되고, 대소문자 구분 문자열이에요.
aud REQUIRED ID 토큰이 대상으로 하는 수신자(들). 반드시 신뢰 당사자(RP)의 OAuth 2.0 client_id를 수신자 값으로 포함해야 해요. 일반적으로 문자열 배열이지만, 수신자가 하나뿐이면 단일 문자열일 수도 있어요.
exp REQUIRED 만료 시각. 이 시각 이후에는 인증에 ID 토큰을 써서는 안 돼요. 시계 오차(clock skew)를 위해 보통 몇 분 정도의 여유를 둘 수 있어요. UTC 기준 1970-01-01T00:00:00Z 이후의 초 수를 나타내는 JSON 숫자예요.
iat REQUIRED JWT가 발급된 시각. exp와 같은 방식의 초 단위 JSON 숫자예요.
auth_time 최종 사용자 인증이 일어난 시각. max_age 요청을 하거나 auth_time을 필수 클레임으로 요청했다면 REQUIRED, 아니면 OPTIONAL이에요.

다음 클레임들은 선택(OPTIONAL)이에요.

  • nonce — 클라이언트 세션을 ID 토큰과 연결하고 재생 공격을 막는 문자열 값. 인증 요청에서 받은 값을 그대로 ID 토큰으로 전달돼요. 인증 요청에 nonce가 있으면 인가 서버는 ID 토큰에 nonce 클레임을 넣어야 하고, 클라이언트는 그 값이 보낸 값과 같은지 반드시 검증해야 해요.
  • acr — 인증 컨텍스트 클래스 참조(Authentication Context Class Reference). 값 "0"은 ISO/IEC 29115 수준 1을 충족하지 못한 인증을 뜻해요.
  • amr — 인증에 사용된 방법을 나타내는 문자열 배열(예: 비밀번호와 OTP를 모두 쓴 경우).
  • azp — 인가된 당사자(Authorized party). ID 토큰이 발급된 상대방으로, 있으면 이 파티의 OAuth 2.0 클라이언트 ID를 담아야 해요.

ID 토큰은 위에 정의된 것 외에 다른 클레임도 포함할 수 있어요. 이해하지 못한 클레임이 있으면 반드시 무시해야 해요.

서명과 암호화

ID 토큰은 JWS로 서명해야 하고, 선택적으로 서명 후 JWE로 암호화할 수도 있어요. 이로써 인증의 진위성과 무결성을 보장하지요.

더 알아보기

  • 인가 코드 플로에서 ID 토큰에 추가로 요구되는 at_hash 클레임과 검증 규칙은 Core 스펙의 3.1.3절을 참고해요.
  • 표준 클레임(Standard Claims) 정의는 Core 스펙의 5.1절에서 다뤄요.
  • ID 토큰의 서명 검증 일반 원칙은 JWT 스펙(RFC 7519)과 JWS(RFC 7515)를 참고해요.