3 minute read

1. OpenID Connect란?

OAuth의 개념을 공부하다보니 OpenID Connect와 마주치게 되었습니다. OpenID Connect는 OAuth 2.0 프로토콜을 기반으로 개발되어 ID 토큰이라고 불리는 JWT(JSON Web Token)를 사용합니다. 사용자 인증에 초점을 맞추므로, 소셜 로그인을 활성화하는데 널리 사용되고 있습니다. OAuth 프로토콜을 기반으로 개발되다 보니, 플로우도 비슷합니다.

OpenID Connect vs OAuth

openid.net은 다음과 같이 설명하고 있습니다.

OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 protocol. It allows Clients to verify the identity of the End-User based on the authentication performed by an Authorization Server, as well as to obtain basic profile information about the End-User in an interoperable and REST-like manner. 출처: What is OpenID Connect?

OIDC(OpenId Connect)는 기본적으로 OAuth 2.0의 상단 레이어이고, 사용자의 인증(athentificaton)을 위한 것입니다. 소셜로그인을 예로 들어보겠습니다. 제가 만약에 일정관리 앱을 새롭게 개발했다고 가정하면, 저는 유저관리를 잘 해야할 것입니다. 적어도 유저를 구분할 수 있는 유효한 이메일은 필요할 것입니다. 이 때 OpenId Connect는 리소스 서버(카카오, 구글 등)를 활용하여, 사용자가 어떤 사람(identity)인지 확신할 수 있도록 인증을 수행해줍니다. 사용자는 카카오에 로그인을 수행하고, 카카오가 유저의 이메일을 전달해주는 것입니다.

그리고 OAuth는 사용자의 리소스에 접근할 수 있는 권한을 위임(Authorization)하는 것이 목적입니다. 일정관리 앱으로 다시 예를 들자면, 이 앱에서, 사용자의 구글 캘린더 리소스에 접근하여 데이터를 읽고 수정할 권한을 부여하는 것입니다. 사용자의 identity가 아니라, API의 보안을 제공한다고 생각하시면 될 것 같습니다.

The OAuth 2.0 protocol provides API security through scoped access tokens. OAuth 2.0 enables you to delegate authorization, while OIDC enables you to retrieve and store authentication information about your end users. OIDC extends OAuth 2.0 by providing user authentication and single sign-on (SSO) functionality. 출처: OAuth 2.0 vs OpenID Connect

정리해보자면, OIDC는 사용자 인증 및 SSO(Single Sign-On) 기능을 제공하여 OAuth 2.0을 확장합니다. OIDC가 사용자의 인증된 정보를 획득하도록 하는 반면, OAuth는 API에 대한 위임된 권한을 가지도록 합니다.

2. ID Token vs Access Token

일단 ID Token은 OIDC(OpenID Connect)와 관련된 것이고, Access Token은 지난 포스팅에서 확인할 수 있듯이 OAuth와 관련된 것임을 기억하고, 하나씩 들여다보겠습니다.

2-1. ID Token

ID Token은 유저가 인증되었음을 증명해주는 것입니다. OIDC에서 제공해주는 표준 규격이며, 많은 identity providers(구글, 페이스북, 카카오, 네이버 등)에 의해 사용되고 있습니다. 클라이언트에게 이 유저는 신원이 증명된 유저라는 증거로서 identity provider가 제공해주는 것이지요.

a very basic idea of what an ID token is: proof of the user’s authentication 유저 인증의 증거! 라고 한 마디로 표현할 수 있을 것 같습니다.

ID Token은 JWT로 인코딩 됩니다. JWT는 보통 아래와 같이 생겼습니다.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwOi8vbXktZG9tYWluLmF1dGgwLmNvbSIsInN1YiI6ImF1dGgwfDEyMzQ1NiIsImF1ZCI6IjEyMzRhYmNkZWYiLCJ
leHAiOjEzMTEyODE5NzAsImlhdCI6MTMxMTI4MDk3MCwibmFtZSI6IkphbmUgRG9lIiwiZ2l2ZW5fbmFtZSI6IkphbmUiLCJmYW1pbHlfbmFtZSI6IkRvZSJ9.
bql-jxlG9B_bielkqOnjTY9Di9FillFb6IMQINXoYsw

자세히 들여다보면 (.)으로 총 세 부분으로 나뉘어져 있음을 알 수 있는데요, 이 중 가운데 부분을 디코딩 해보면 아래처럼 claim들이 들어 있습니다.

{ 
  "iss": "http://kakao", 
  "exp": 1311281970, 
  "iat": 1311280970, 
  "name": "hannah", 
  "email": "hannah@naver.com"
}

claims에는 유저의 정보와 JWT토큰 자체의 정보가 들어있습니다. 이로 인해서, 이 사용자가 identity providers에 의해서 인증된 사용자라는 것을 알 수 있는 것입니다. 카카오 로그인을 예를 들어보겠습니다. 이 정보를 카카오에서 보내준다면, 우리는 아, 이 hannah라는 사람은 카카오에서 인증된 사용자이고, 보내준 이메일로 우리 서비스에 가입시키면 되겠구나! 하는 것입니다. 가입 절차가 훨씬 간편해지겠죠?

2-2. Access Token

Access Token은 클라이언트가 리소스 서버의 API에 접근하기 위한 토큰입니다. 이것은 JWT를 일반적으로 사용하기는 하나, 모든 형식의 문자열이 가능합니다. 위의 OAuth에서 사용되는 것이지요. 이것을 사용하면 클라이언트는 사용자를 대신해서 리소스 서버에 접근하여 특정 작업을 수행할 수 있습니다. 예를 들어 제가 만든 일정관리앱(클라이언트)에서 리소스서버(구글캘린터)의 API를 엑세스 토큰과 함께 호출해서, 사용자의 일정 정보를 가져온다거나, 혹은 작성한다거나 할 수 있습니다.

3. ID Token과 Access Token의 사용

auth0.com 에서는 ID Token과 Access Token의 사용이 적합하지 않은 때를 명시하고 있습니다.

  • ID Token이 적합하지 않은 사용 예 ID Token을 사용하여 API를 호출하려 시도해서는 안됩니다. API를 호출하는 것은 scope(자원 접근 권한의 범위)가 정해진 Access Token이라는 것을 기억합시다.

  • Access Token의 적합하지 않은 사용 예 클라이언트 애플리케이션에서 access token을 검증하려고 해서 안됩니다. 이것은 Authorization server와 resource server간의 합의이므로, 검증은 리소스 서버에게 맡겨야 합니다.

포스팅은 여기까지입니다. 감사합니다.

참고

auth0.com

OAuth 2.0 vs OpenID Connect

What is OpenID Connect?


광고


Comments