불투명 토큰 (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_id
및client_secret
매개변수를 사용합니다:client_id
: 토큰을 요청한 애플리케이션의 클라이언트 IDclient_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로 교체하는 것을 잊지 마세요.