불투명 토큰 (Opaque token)이란 무엇인가?
불투명 토큰은 클라이언트에게는 의미가 없지만 서버의 데이터베이스에서 권한 데이터를 조회하는 참조 키 역할을 하는 무작위의 고유한 문자열입니다.
불투명 토큰은 일반적으로 암호학적으로 안전한 의사 난수 생성기 을 사용하여 예측 불가능성과 보안을 보장하기 위해 생성되며, 그 형식은 발급자 (issuer)에 의해 결정됩니다.
다음은 불투명 토큰의 예입니다:
M-oxIny1RfaFbmjMX54L8Pl-KQEPeQvF6awzjWFA3iq
JWT (JSON Web Token)와 불투명 토큰의 차이점은 무엇인가?
주요 차이점은 이러한 토큰이 권한 정보를 처리하고 검증하는 방식에 있습니다:
불투명 토큰은 자체적으로 정보를 포함하지 않는 무작위 문자열입니다. 서버는 이 토큰과 관련된 권한 데이터를 검색하기 위해 백엔드 데이터베이스를 조회해야 합니다. 이는 불투명 토큰이 검증과 해석을 위해 권한 서버 (authorization server)에 완전히 의존하게 만듭니다.
JWT는 필요한 모든 정보를 자체적으로 포함하는 독립형 토큰입니다.
다음은 base64로 인코딩된 JWT의 예입니다:
eyJhbGciOiJIUzI1NiIs.eyJzdWIiOiIxMjM0NTY3O.SflKxwRJSMeKKF2QT4f
그리고 점으로 구분된 세 부분을 포함합니다:
- 헤더 - 토큰의 유형과 서명에 사용된 알고리즘에 대한 정보를 포함합니다. 예를 들어,
{"alg": "HS256", "typ": "JWT"}
. - 페이로드 - 사용자 또는 권한에 대한 정보 조각인 클레임 (claim)을 포함합니다. 사용자 ID, 만료 시간, 스코프 (scope) 등이 포함될 수 있습니다. 이는 인코딩되어 있지만 암호화되지 않았기 때문에 누구나 클레임을 볼 수 있습니다.
- 서명 - 지정된 알고리즘을 사용하여 헤더, 페이로드 및 비밀 키를 결합하여 생성됩니다. 이 서명은 토큰의 무결성을 검증하고 변조되지 않았음을 보장하는 데 사용됩니다.
이 구조는 JWT가 데이터베이스를 조회하지 않고도 검증되고 사용할 수 있게 합니다.
JWT에 대한 자세한 정보는 JSON 웹 토큰 (JSON Web Token, JWT) 를 참조하세요.
또한 불투명 토큰 vs JWT 를 확인하여 그들의 차이점을 더 깊이 있게 알아보세요.
불투명 토큰을 어떻게 검증하는가
간단한 시스템에서는 불투명 토큰 검증이 일반적으로 서버에 의해 직접 처리되며, 서버는 불투명 토큰을 키로 사용하여 데이터베이스를 조회하여 관련된 권한 정보를 검색합니다.
OAuth 2.0을 도입한 다중 파티 시스템에서는 여러 리소스 서버 (resource server)가 동일한 불투명 토큰을 검증해야 할 수 있습니다. OAuth 2.0은 이 검증을 위한 표준화된 토큰 인트로스펙션 (token introspection) 메커니즘을 제공합니다:
토큰 인트로스펙션에 대한 자세한 정보는 토큰 인트로스펙션 (Token introspection) 를 참조하세요.
OIDC에서 불투명 토큰은 어떻게 사용되는가?
OIDC ( OpenID Connect (OIDC) )의 맥락에서 불투명 토큰은 다양한 시나리오에서 특정 목적을 수행합니다:
사용자 프로필 검색
기본적으로, 클라이언트가 리소스를 지정하지 않고 openid
스코프를 포함하여 액세스 토큰을 요청할 때, 권한 서버는 불투명 액세스 토큰을 발급합니다. 이 토큰은 주로 OIDC /oidc/userinfo
엔드포인트 (userinfo endpoint)에서 사용자 프로필 정보를 검색하는 데 사용됩니다.
리프레시 토큰 교환
리프레시 토큰 (refresh token)은 일반적으로 불투명 토큰으로 발급되며, 이는 클라이언트와 권한 서버 간에만 교환됩니다. 현재 액세스 토큰이 만료되면, 클라이언트는 불투명 리프레시 토큰을 사용하여 사용자를 다시 인증하지 않고 새 액세스 토큰을 얻을 수 있습니다.
불투명 토큰의 장단점은 무엇인가?
장점
-
보안: 불투명 토큰은 리프레시 토큰과 같은 민감한 데이터를 처리하는 데 적합합니다. 내용이 완전히 무작위이고 의미가 없기 때문에 누군가가 토큰을 가로채더라도 유용한 정보를 추출할 수 없습니다. 이는 은행 거래나 민감한 사용자 데이터를 처리하는 고보안 시나리오에서 특히 가치가 있습니다.
-
철회 가능성: 서버는 언제든지 불투명 토큰을 즉시 무효화할 수 있습니다. 이는 사용자 액세스를 빠르게 제거해야 할 때 특히 유용합니다. 만료될 때까지 유효한 JWT와 달리, 불투명 토큰은 즉시 철회될 수 있습니다 (참조: JWT의 한계 ).
-
크기: 불투명 토큰은 일반적으로 JWT보다 훨씬 짧습니다. 이 작은 크기는 네트워크 대역폭 사용량과 저장 요구 사항을 줄입니다. 이는 모바일 애플리케이션이나 IoT 장치와 같이 토큰을 자주 전송하는 시스템에서 특히 눈에 띄게 됩니다.
-
단순성: 불투명 토큰의 구현은 간단합니다. 무작위 문자열을 생성하고 관련 데이터를 저장하면 됩니다. JWT와 같은 복잡한 암호화나 서명 검증을 처리할 필요가 없습니다. 이 단순성은 내부 시스템 인증에 이상적입니다.
단점
-
상태 유지: 모든 불투명 토큰은 서버 측에 저장이 필요합니다. 이는 분산 시스템에서 토큰 데이터가 여러 서버에 걸쳐 동기화되어야 하기 때문에 추가적인 복잡성을 만듭니다. 예를 들어, 여러 인증 서버가 있는 경우, 모든 서버가 동일한 토큰 데이터베이스나 캐시 시스템에 접근하여 토큰을 올바르게 검증해야 합니다.
-
성능: 토큰 검증은 항상 데이터베이스 조회나 API 호출을 필요로 합니다. 고트래픽 시스템에서는 이러한 추가 데이터베이스 조회가 성능 병목을 초래할 수 있습니다. 예를 들어, 초당 수천 건의 요청을 처리하는 시스템에서 각 요청이 토큰 검증을 필요로 한다면, 추가적인 데이터베이스 부하가 상당해집니다.
-
상호 운용성: 다른 시스템은 불투명 토큰을 다른 방식으로 구현할 수 있습니다. 이는 타사 서비스나 다른 권한 서버와 작업할 때 통합 문제를 일으킬 수 있습니다. OAuth 2.0 토큰 인트로스펙션과 같은 표준이 도움이 되지만, 시스템이 다른 토큰 형식이나 검증 방법을 사용할 때 호환성 문제가 발생할 수 있습니다.