스프링 시큐리티 OAuth2/OAuth 2.0 Open ID Connect, Client

OAuth 2.0 Open ID Connect - ID Token & Scope

webmaster 2023. 1. 13. 21:19
728x90

ID Token

  • ID 토큰은 사용자가 인증 되었음을 증명하는 결과물로서 OIDC 요청 시 access token 과 함께 클라이언트에게 전달되는 토큰이다
    • Access 토큰 자체는 인증이 되었다는 것을 증빙할 순 없지만, ID 토큰과 같이 전달이 되면 인증되었음을 증명할 수 있다.
  • ID 토큰은 JWT(JSON 웹 토큰)으로 표현되며 헤더, 페이로드 및 서명으로 구성된다
  • ID 토큰은 개인 키로 발급자가 서명하는 것으로서 토큰의 출처를 보장하고 변조되지 않았음을 보장한다.
  • 어플리케이션은 공개 키로 ID 토큰을 검증 및 유효성을 검사하고 만료여부 등 토큰의 클레임을 확인 한다 -> 인증 처리
  • 클라이언트는 클레임 정보에 포함되어 있는 사용자명, 이메일을 활용하여 인증 관리를 할 수 있다

ID Token vs Access Token 

ID Token vs Access Token

  • ID Token 은 API 요청에 사용해서는 안되며 사용자의 신원확인을 위해 사용되어야 한다
  • Access Token 은 인증을 위해 사용해서는 안되며 리소스에 접근하기 위해 사용되어져야 한다

OIDC Scope

scope
openid(필수) 클라이언트가 OpenID Connect 요청을 하고 있음을 인증 서버에 알린다
profile 기본 프로필 클레임에 대한 액세스 요청
email 이메일 및 email_verified 클레임에 대한 액세스 요청
address 주소 클레임에 대한 액세스 요청
phone phone_number phone_number_verified 클레임에 대한 액세스 요청

해당 정보들이 JWT안에 포함되어 있다.

OIDC 로그인 요청

OIDC 상호 작용 행위자
  • OpenID Provider
    • 줄여서 OP 라고 하며 OpenID 제공자로서 최종 사용자를 인증하고 인증 결과와 사용자에 대한 정보를 신뢰 당사자에게 제공할 수 있는 Oauth 2.0 서버를 의미한다
  • Relying Party
    • 줄여서 RP 라고 하며 신뢰 당사자로서  인증 요청을 처리하기 위해 OP에 "의존"하는 Oauth 2.0 애플리케이션을 의미한다
  1. RP는 OP에 권한 부여 요청을 보낸다.
  2. OP는 최종 사용자를 인증하고 권한을 얻는다.
  3. OP는 ID 토큰과 액세스 토큰으로 응답한다.
  4. RP는 Access Token을 사용하여 UserInfo 엔드포인트에 요청을 보낼 수 있다.
  5. UserInfo 엔드포인트는 최종 사용자에 대한 클레임을 반환한다.

OIDC 로그인 요청

매개변수 요청 및 응답
요청, 응답 결과
  • 요청 시 openid 범위를 scope 매개 변수에 포함해야 한다.
  • response_type 매개 변수는 id_token을(를) 포함 한다. (response_type 이 해당 토큰을 지원해야 한다)
  • 요청은 nonce 매개 변수를 포함해야 한다. (Implicit Flow 인 경우 필수)
    • 요청에 포함되는 값으로서 결과 id_token 값에 클레임으로 포함되며 이것은 토큰의 재생 공격을 방지하고 요청의 출처를 식별하는 데 사용할 수 있는 임의의 고유 문자열이다.
    • 해당 nonce 클레임에는 요청에서 전송된 것과 정확히 동일한 값이 포함되어야 합니다. 그렇지 않은 경우 애플리케이션에서 인증을 거부해야 한다

Test

Scope에 openid를 추가한다.
공개키로 받는 id_token

  • 실행시 id_token을 발급받으며, 해당 토큰을 통해 얻은 정보를 https://jwt.io/ 에서 decode 할 수 있다.
  • decode 해서 얻은 값을 통해 애플리케이션에서 한번 더 인증 처리를 진행하면 된다.
  • id_token은 Resource-server를 접근하기 위한 목적으로 생성된 것이 아니기 때문에 해당 정보로 리소스서버는 접근할 수 없다.
  • id_token을 통해 공개키로 받을 때에는 nonce 필드를 추가해야 한다

 

 

728x90