OpenID Connect

2024. 2. 9. 17:35카테고리 없음

1. OpenID Connect는 무엇인가?

OpenID Connect는 OAuth 2.0 프로토콜(IETF RFC 6749 및 6750)를 기반으로 하는 인증 프로토콜입니다. OpenID Connect 프로토콜은 Authorization Server에서 수행한 인증을 기반으로 사용자의 신원을 확인하고 프로필을 얻을 수 있는 방법을 간소화한 것입니다.

 

즉, 정리하면 OpenID Connect는 OAuth 2.0 프로토콜 기반의 사용자의 신원을 확인하는 인증 프로토콜입니다. 대표적으로 OpenID Connect를 지원하는 서비스 제공자는 구글, 카카오 등이 존재합니다.

 

OpenID는 2006년 1.0 버전을 표준으로 출시하였고 이후 2007년에 2.0 버전이 출시되었습니다. 2014년 3세데 OpenID로 OpenID Connect가 등장하게 되었습니다. 그래서 OpenID Connect를 줄여서 OIDC라고 부릅니다.

 

1.1 OpenID Connect 용어

다음 용어들은 OpenID Connect에서 주체가 되거나 수행과정에서 다루는 용어들입니다.

 

  • Authentication : OIDC를 통해 클라이언트는 사용자를 식별하고 사용자의 정보를 전달하는 과정
  • Client : 사용자의 정보에 접근하기를 원하는 사람. 이 사람은 소프트웨어의 일부분일 수 있습니다.종종 RP(Relying Party)라고 부를 수 있습니다. 클라이언트는 OP(OpenID Provider)에 등록되어야 합니다. 클라이언트는 웹 애플리케이션이나 네이티브 모바일, 데스크톱 애플리케이션 등이 될 수 있습니다.
  • Relying Party : RP(Relying Party)는 Identity Provider에 사용자 인증 기능을 위임하는 애플리케이션입니다.
  • OpenID Provider (OP) or Identity Provider (IDP) : OpenID Provider(OP)는 OpenID Connect와 OAuth2.0 프로토콜을 구현한 엔티티입니다. OP는 보안 토큰 서비스, IDP(Identity Provider) 또는 인증 서버와 같은 역할로 언급될 수 있습니다. 대표적인 IDP는 카카오, 구글과 같은 서버가 있습니다.
  • Identity Token : Identity Token은 인증 프로세스의 결과물입니다. Identity Token은 사용자에 대한 최소한의 식별 정보를 가지고 있습니다.
  • User : 리소스에 접근하기 위해 등록된 클라이언트를 사용하는 사람입니다. 대표적으로 브라우저를 사용하는 사람이 되겠습니다.

 

2. OpenID Connect와 OAuth 2.0

2.1 OpenID Connect는 OAuth 2.0의 확장

 

 

위 그림과 같이 OAuth 2.0 프로토콜은 HTTP 프로토콜을 기반으로 동작하고 OpenID Connect(OIDC) 인증 프로토콜은 OAuth 2.0 프로토콜을 기반으로 동작하는 계층입니다. 즉, OpenID Connect는 사용자 인증을 OAuth 2.0 프로토콜을 확장하여 구현한 것임을 알 수 있습니다.

 

2.2 OpenID Connect와 OAuth 2.0의 차이

OAuth 2.0은 애플리케이션(클라이언트)이 사용자 대신 Resource Owner로부터 사용자의 리소스 정보에 접근하기 위해서 사용됩니다. 즉, OAuth 2.0의 주요한 목적은 인증이 아닌 인가(Authorization)이라는 점이 중요합니다. 애플리케이션이 사용자로부터 권한을 위임받기 위해서 사용자가 로그인 인증 및 프롬프트 화면을 통해서 권한을 위임하는 부차적인 과정이 존재하지만, 핵심적인 목적은 애플리케이션이 사용자로부터 권한을 위임받아서 사용자의 리소스에 대신 접근하는 것입니다.

 

OAuth 2.0 프로토콜은 애플리케이션에 권한을 위임한 사용자에 대한 신상 정보를 명시적으로 제공하지 않고 액세스 토큰(Access Token)이라는 형태로 권한을 제공합니다. 액세스 토큰은 집 열쇠에 비유할 수 있습니다. 열쇠만으로 열쇠의 소유자가 집에 들어갈 수 있지만, 열쇠의 소유자가 도둑인지 집주인인지 전혀 알 수 없습니다.

 

하지만 OpenID Connect의 주요한 목적은 인증(Authentication)입니다. OpenID Connect를 사용하면 애플리케이션은 ID Token을 얻을 수 있습니다. 이 ID Token에는 사용자에 대한 신원 정보가 담겨 있습니다. 액세스 토큰이 집 열쇠라면 ID Token은 주민등록증이라고 할 수 있습니다. 주민등록증으로 신원 확인(이름, 거주지, 주민등록번호 등)을 확인할 수는 있지만, 집에는 들어갈 수는 없습니다. (집열쇠 없이 주민등록증만 있다고 가정)

 

정리하면, OAuth 2.0은 Resource Owner에 있는 사용자의 리소스에 접근하기 위한 액세스 토큰을 확보하는 것이 목적이라면, OpenID Connect는 사용자의 신원 정보가 담긴 ID Token을 확보하는 것이 주요한 목적입니다.

 

2.3 OAuth 2.0 대신 OpenID Connect의 사용하는 이유는 무엇인가?

OAuth 2.0은 Resource Owner에 저장되어 있는 사용자의 리소스에 접근하기 위해서 사용합니다. 이 과정에서 Authorization Server를 통해서 사용자를 인증하는 과정을 거칩니다. 예를 들어 다음 시퀀스 다이어그램에서 3~4번 과정에 해당됩니다.

 

 

위 시퀀스 다이어그램의 3~4번 과정을 통해서 사용자는 로그인을 수행하여 인증하는 과정을 거치게 됩니다. 그래서 사용자의 리소스 정보가 필요하면 OAuth 2.0 Authorization Grant Flow를 거쳐서 발급된 액세스 토큰을 가지고 사용자의 리소스에 접근하면 될것입니다.

물론 OpenID Connect 프로토콜없이 사용자 프로필 정보를 리소스 서버로부터 가져올 수 있습니다. 하지만 OpenID Connect 없이 OAuth 2.0만 가지고 사용자 프로필 정보에 접근한다면 OpenID Connect를 사용할때의 2배의 통신을 수행해야 할 것입니다.

 

OAuth 2.0 단독으로 사용한다면 액세스 토큰 발급 및 Resource Owner로 요청하여 받아와야 합니다. 하지만 OpenID Connect를 사용하면 액세스 토큰과 함께 전달받은 ID Token을 복호화하여 사용자 정보를 가져오면 끝입니다. 에를 들어 OAuth 2.0 단독으로 사용하여 사용자의 정보를 가져오는 통신이 1억회라면 OpenID Connect를 사용하면 5천만회로 줄어듭니다.

 

2.4 OpenID Connect 인증과정

OpenID Connect의 인증 과정은 OAuth 2.0의 Authorization 프로세스를 기반으로 동작합니다. 다음 시퀀스 다이어 그램은 OAuth 2.0 Authorization 프로세스의 시퀀스 다이어그램입니다. 이 과정 중간에 ID Token을 발급받습니다.

 

 

위 시퀀스 다이어그램에서 2번 과정에서 scope로 openid를 쿼리 파라미터값으로 전달하여 액세스 토큰 발급시 ID Token도 같이 발급받기를 요청합니다. 사용자는 로그인 인증 및 권한 위임 과정을 거쳐서 7번 과정에서 사용자로부터 전달받은 authorization code 및 애플리케이션 자격증명 정보를 같이 Authorization Server에 전달 및 요청하여 액세스 토큰 및 ID Token 발급을 요청합니다. 인증정보가 모두 일치하면 Authorization Server는 ID Token 및 Access Token을 응답합니다.

 

ID Token 및 Access Token 모두 JWT 형식으로 응답받고 ID Token을 복호화하면 다음과 같은 내용을 가질 수 있습니다.

 

{
  "iss": "<http://my-domain.auth0.com>",
  "sub": "auth0|123456",
  "aud": "my_client_id",
  "exp": 1311281970,
  "iat": 1311280970,
  "name": "Jane Doe",
  "given_name": "Jane",
  "family_name": "Doe",
  "gender": "female",
  "birthdate": "0000-10-31",
  "email": "janedoe@example.com",
  "picture": "<http://example.com/janedoe/me.jpg>"
}

 

위와 같이 iss , exp 같은 기본적인 클레임과 함께 sub 라는 유저 식별 정보(ID)를 응답합니다. 위 예시와 같이 스코프에 따라서 이름, 성별, 생년월일, 이메일, 프로필 사진등을 같이 받을 수 있습니다. 따라서 발급받은 액세스 토큰으로 추가적으로 Resource Owner로 요청하여 사용자의 정보에 접근하지 않고 경우에 따라서 ID Token만으로 서비스를 해결할 수 있습니다.

 

정리

정리하면 OpenID Connect는 OAuth 2.0 프로토콜을 기반으로 확장하여 사용자 인증 기능을 구현한 인증 프로토콜입니다. OpenID Connect와 OAuth 2.0의 차이는 OAuth 2.0은 주요한 목적이 인증이 아닌 사용자 대신 리소스 정보에 접근하기 위해 권한 인가(Authroziation)하는 것에 있고 Open ID Connect는 주요한 목적인 사용자의 신상정보를 확인하는 인증(Authentication)에 있습니다.

 

OAuth 2.0을 단독으로 사용하는 것이 아닌 OpenID Connect를 사용하는 이유는 OAuth 2.0 단독으로 사용시 액세스 토큰 발급후 Resource Owner로부터 사용자의 리소스에 접근하기 위한 추가적인 요청이 필요하지만 OpenID Connect는 추가적인 스코프를 설정하여 액세스 토큰 발급 단계에세 ID Token을 같이 발급받음으로써 ID Token을 복호화하여 사용자의 신상 정보를 확인할 수 있기 때문입니다. 

 

 OpenID Connect의 인증과정은 OAuth 2.0 Authorization 프로세스 수행과정 중에서 액세스 토큰을 발급받는 과정에서 추가적인 ID Token을 발급받음으로써 수행됩니다.

 

References