본문으로 건너뛰기

불투명 토큰 (Opaque token)

인증 과정에서 리소스가 지정되지 않으면, Logto는 JWT 대신 불투명 액세스 토큰을 발급합니다. 불투명 토큰은 무작위 문자열이며, JWT보다 훨씬 짧습니다:

{
"access_token": "some-random-string", // 불투명 토큰
"expires_in": 3600,
"id_token": "eyJhbGc...aBc", // JWT
"scope": "openid profile email",
"token_type": "Bearer"
}

불투명 토큰은 userinfo 엔드포인트를 호출하고 인증이 필요한 보호된 리소스에 접근하는 데 사용할 수 있습니다. JWT가 아니기 때문에, 리소스 서버는 이를 어떻게 검증할 수 있을까요?

Logto는 불투명 토큰을 검증할 수 있는 introspection 엔드포인트를 제공합니다. 기본적으로 introspection 엔드포인트는 /oidc/token/introspection이며 POST 요청을 수락합니다. 다음 매개변수가 필요합니다:

  • token: 검증할 불투명 토큰

엔드포인트는 또한 클라이언트 인증이 필요합니다. 다음 방법 중 하나를 사용할 수 있습니다:

  • HTTP Basic 인증: Authorization 헤더에 Basic <base64-encoded-credentials> 값을 사용합니다. 자격 증명은 클라이언트 ID와 클라이언트 시크릿을 콜론 (:)으로 구분하고 base64로 인코딩해야 합니다.
  • HTTP POST 인증: client_idclient_secret 매개변수를 사용합니다:
    • client_id: 토큰을 요청한 애플리케이션의 클라이언트 ID
    • client_secret: 토큰을 요청한 애플리케이션의 클라이언트 시크릿

클라이언트 ID (앱 ID)와 클라이언트 시크릿 (앱 시크릿)은 Logto의 "전통적인 웹" 또는 "기계 간" 애플리케이션의 앱 자격 증명일 수 있습니다. 자격 증명이 유효하지 않으면 introspection 엔드포인트는 오류를 반환합니다.

introspection 엔드포인트는 토큰의 클레임을 포함한 JSON 객체를 반환합니다:

{
"active": true, // 토큰이 유효한지 여부
"sub": "1234567890" // 토큰의 주체 (사용자 ID)
}

토큰이 유효하지 않으면, active 필드는 false가 되고 sub 필드는 생략됩니다.

다음은 introspection 요청의 비규범적 예입니다:

curl --location \
--request POST 'https://[tenant-id].logto.app/oidc/token/introspection' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'token=some-random-string' \
--data-urlencode 'client_id=1234567890' \
--data-urlencode 'client_secret=1234567890'

[tenant-id]를 자신의 테넌트 ID로 교체하는 것을 잊지 마세요.