한국어
  • oidc
  • oauth
  • api resource
  • jwt
  • access token
  • opaque token

Connecting the dots: OIDC 자원과 JWT 액세스 토큰에 대한 심층 탐색

이 블로그 게시물은 OIDC 자원 지표와 그들이 액세스 토큰을 얻는 역할 간의 관계에 대해 설명하고자 합니다.

Charles
Charles
Developer

배경

a previous session에서 우리는 OpenID Connect (OIDC) 프로토콜, 새로고침 토큰, 액세스 토큰, ID 토큰에 대한 소개를 제공했으며, 이는 애플리케이션에 견고한 인증을 구축하기 위한 필수 구성 요소입니다. 그러나 우리 커뮤니티에서는 여전히 질문이 남아 있는데, 반복되는 질문 하나는 "왜 내 액세스 토큰은 JWT가 아닌가요?”입니다.

개념에 처음 접하는 사람들 또는 리프레셔가 필요한 사람들을 위해 이 블로그 게시물은 OIDC 자원 지표와 그들이 액세스 토큰을 얻는 역할 간의 관계에 대해 설명하려고 합니다.

OIDC 자원 이해하기

OAuth 2.0 프로토콜에 익숙하다면, “resource”라는 용어가 맞아 떨어져야 한다. OIDC는 OAuth 2.0 위에 구축된 것이기 때문에 이와 같은 개념을 상속합니다.

"resource" 또는 "protected resource"는 클라이언트 응용 프로그램이 인증된 사용자를 대신하여 액세스 하고자 하는 엔티티의 표현입니다. 이는 사용자 정보, 서버 API, 또는 서버에서 승인한 다른 데이터일 수 있습니다.

프로토콜에 따르면, 자원은 인증 서버에 대한 요청에 파라미터로 포함됩니다. 이는 절대 URI, 예를 들어 https://my-company.com/api 와 같이 표현되는 값입니다. 이것은 자원을 위한 식별자로 작동하며, 네트워크 가용 위치에 해당하거나 심지어 고유하지만 가상의 URI에 해당할 수 있습니다.

Logto에서는 “Admin Console → API 자원” 페이지에서 “API 자원”을 생성할 수 있습니다. 이 설명서를 참조하세요.

JWT 액세스 토큰

JWT (JSON 웹 토큰) 형식의 액세스 토큰은 액세스 토큰 요청 중에 "리소스" 파라미터가 지정될 때에만 발행되며, 이는 당신이 복호화하고 유효성을 검사할 수 있는 일련의 클레임들을 가지고 있습니다. 예를 들어, 토큰의 무결성과 사용자의 권한을 확인하기 위해.

이 "자원"은 그러면 토큰의 aud 클레임 중 하나가 되어, 토큰의 예정된 청중을 나타냅니다. 참조: RFC-7519.

그래서, 관계가 명확해집니다:

  • JWT 토큰을 요청할 때 자원 지표를 지정합니다.
  • 자원 지표는 **aud**토큰 클레임과 일치합니다.
  • API 요청을 할 때 JWT 액세스 토큰은 반드시 헤더에 포함되어야 합니다. 당신의 API 서버는 aud 클레임 및 기타 권한 관련 클레임을 복호화하고 검증하여 API 요청을 보호해야 합니다.
  • 각 액세스 토큰은 단일 자원에 해당합니다. 다양한 URI로 등록된 여러 API 자원이있는 경우, 각각에 대해 별도의 액세스 토큰을 요청하세요.

🤔 하지만 클라이언트가 액세스 토큰을 요청할 때 자원을 지정하지 않는다면 어떻게 될까요?

불투명 액세스 토큰

Logto의 경우, 액세스 토큰을 요청할 때 자원 지표가 지정되지 않았다면, 인증 서버는 그것이 OIDC '/userinfo'엔드포인트를 위한 것이라고 가정하며, 따라서 OIDC userinfo 엔드포인트에서 나중에 클라이언트가 사용자 프로파일(사용자 ID, 이름, 이메일 등)을 요청하는 데 사용할 수 있는 불투명 액세스 토큰이 발행될 것입니다.

Logto SDK에서는 getAccessToken()을 호출하거나 resource 파라미터를 지정하지 않고 직접 OIDC 토큰 엔드포인트를 요청하면 이런 토큰을 얻을 수 있습니다.

당신의 자체 API 자원 요청에는 이 불투명 액세스 토큰이 적합하지 않다는 것을 유의해야 합니다. 이는 OIDC 서버를 요청하지 않고는 검증할 방법이 없기 때문입니다.

결론

OIDC 자원은 클라이언트 응용 프로그램이 사용자를 대신하여 액세스하려는 특정 데이터 또는 서비스를 정의하며, JWT 액세스 토큰은 이러한 액세스를 위한 안전한 수단으로서 역할을 합니다. JWT 액세스 토큰의 "aud" 클레임은 자원 지표와 일치하여 클라이언트 요청시 서버가 권한을 검증하는 데 도움을 줍니다.

Logto에서는 불투명 액세스 토큰은 OIDC userinfo 엔드포인트에서 사용자 프로파일 정보를 가져오는 데 전용되어 있으며, 클라이언트는 각각 특정 자원에 전용된 여러 액세스 토큰을 요청할 수 있습니다.

이 블로그 게시물이 여러분의 의문점을 모두 해결해 드리고 점들을 연결해 드릴 수 있기를 바랍니다. 의견을 자유롭게 알려주세요.