Skip to main content

Command Palette

Search for a command to run...

OIDC(OpenID Connect)

Updated
•4 min read•View as Markdown
OIDC(OpenID Connect)

Google 로그인 등에 사용되는 OIDC(OpenID Connect)는 OAuth2.0 프로토콜을 기반으로 하고 있습니다.

OAuth 2.0이 인증만 제공하는 반면, OIDC는 인증 기능을 추가하여 사용자 인증 및 인증 시나리오에 대한 보다 표준화된 솔루션을 제공합니다.

간단히 말해: OIDC = 인가 프로토콜 + 신원 인증 프로토콜 입니다.

OIDC의 등장 배경

여러 서비스가 생겨나고 각 서비스는 각자 사용자 정보를 관리하게 됩니다.

하지만, 여러 보안 사고로 각 서비스에 저장된 사용자들의 정보가 유출되는 사고가 발생하고 이에 각 서비스 제공자들은 사용자 정보를 관리하는 것에 큰 부담을 느끼게 됩니다.

사용자들도 각 서비스마다 인증정보를 각각 저장해야하는 부담이 있었고, 이 또한 보안 사고로 이어지기 쉬웠습니다.

따라서 신뢰할 수 있는 서비스에 사용자의 정보 관리와 인증 절차를 위임하고 그 정보를 토대로 각 서비스에서 사용자의 정보를 조회할 수 있도록 하면 보안 문제를 해결할 수 있겠다는 니즈가 있었습니다.

이 문제를 해결하기 위해 등장한 것이 OpenID Foundation에서 추진하는 개방형 표준 및 분신 인증 프로토콜 OpenID Connect(OIDC)입니다.

OIDC는 기존 OpenID 프로토콜의 3세대 프로토콜로서 OAuth2.0을 기반으로 하고 있습니다.

OpenID4

현재는 OIDC를 기반으로 하는 OpenID4VC, OpenID4VP라는 새로운 표준이 발표되었습니다.

ref - OpenID4VC

OAuth 2.0과 OIDC

사실 OAuth 2.0으로 다른 서비스로 부터 사용자의 정보를 가져올 수 있는 것 같습니다.

하지만, OAuth 2.0은 인가(Authorization)에 관한 프로토콜이고 인증(Authentication)에 관한 내용이 아닙니다.

결론부터 말씀드리면, OAuth 2.0은 액세스 토큰(Access Token)을 발급받는 프로토콜이고, OIDC는 인가받은 권한을 바탕으로 사용자의 정보를 가져오는 즉, 인증하는 프로토콜 입니다.

인가(Authorization)과 인증(Authentication)

먼저 인증과 인가 헷갈리는 용어부터 살펴보겠습니다.

인가(Authorization)

인가는 권한을 부여하는 과정으로 "너 뭐 할 수 있어?"를 결정하는 절차입니다.

인증(Authentication)

인증은 사용자 신원 확인 단계로 "너 누구야?" 라고 물어보는 것이 인증입니다.

OAuth 2.0 정리

OAuth 2.0은 "인가(Authorization)"에 관한 프로토콜로 Resource Owner(사용자)가 Client(서비스)에게 권한을 부여하는 과정입니다.

Resource Owner(사용자)는 Authorization Server(Google 등의 인증 서버)에게 자신의 신분을 "인증"하고 Client(서비스)에게 Resource Server(Google 등의 정보 서버)로부터 자신의 정보에 접근할 수 있는 권한을 "인가"하는 과정입니다.

여기서 "인가"받은 권한은 Access Token으로 발급되어 표현됩니다.

따라서, 인가받은 권한으로 Resource Server로부터 사용자의 정보를 가져올 수 있지만 여기서 발생한 문제로 OIDC가 필요해집니다.

OIDC vs OAuth 2.0

OIDC는 OAuth 2.0의 어떤 불편를 해결했는지 알아보겠습니다.

Client가 필요한 것은 사용자의 정보

Client가 OAuth 2.0 과정을 통해 얻고 싶은 것은 보통 사용자의 정보입니다.

Access Token을 얻어 Resource Server에 접근하여 사용자의 정보를 조회할 수 있지만, 번거롭습니다.

제각각의 Access Token 형태

OAuth 2.0에선 인가 받은 권한을 반드시 String 형태로 전달하도록 되어 있습니다.

따라서, Access Token의 형태는 매우 다양한 형태로 전달할 수 있습니다.

- WS-Security Token Profile

- SAML Tokens

- JWT Tokens

- LEGACY Tokens...(ORACLE ACCESS MANAGER, SITEMINDER, etc)

- Custom Tokens...

이는 서비스가 vendor마다 형태에 맞게 대응하게 강요하기 때문에 매우 복잡합니다.

OIDC

OIDC는 OAuth 2.0의 흐름을 지키면서 ID Token이라는 개념을 도입해 이러한 문제를 간단히 해결합니다.

- 먼저 Authorization code를 만드는 흐름에서 SCOPE로 "OPENID PROFILE"이라는 값을 추가하여 OIDC 인증 절차임을 명시합니다.

- 그렇게 redirect되어 Resource Owner(사용자)와의 인증 절차를 거치고 나면 사용자에게 Authorization Code를 받습니다.

- Client는 Authorization Code와 Client ID, Client Secret을 제출하여 Access Token을 발급받으며, 이 때 ID Token도 함께 발급받습니다.

- Client는 ID Token을 통해 사용자 정보를 확인할 수 있습니다. (즉, 사용자가 누구인지 "인증"하게 된 것입니다.)

- 추가적인 정보가 필요하면 OIDC 프로토콜에 따른 별도의 "Userinfo Endpoint"를 통해 조회할 수 있습니다.

OIDC의 장점

OIDC는 OAuth 2.0 과정을 통해 필요한 사용자의 정보가 필요한데, Access Token과 함께 ID token을 함께 발급해 줌으로서 불필요한 요청을 줄였습니다.

- AccessToken 요청 -> AccessToken -> Resource Server에 접근 -> 사용자 정보 조회

- AccessToken + ID Token 요청 -> ID Token -> 사용자 정보 조회

이렇듯 불필요한 요청을 반으로 줄였습니다.

OIDC의 특징

1. 상호운용성

인증 서비스는 기본적으로 다양한 컨슈머 서비스들이 사용할 수 있도록 상호운용성을 반드시 충족해야 합니다. OIDC 또한 표준영역(openid, profile, email, address, phone)에 대해 요청 시 필요한 사용자 정보들을 ID 토큰을 통해 제공할 수 있습니다.

2. 단순성, 모바일 지향 형식

JSON(Javascript Object Notation) 기반의 REST 친화적인 구조를 채택하여 손쉽게 사용할 수 있습니다.

3. 보안

ISO/IEC 29115 Entity Authentication Assurance 프레임워크의 레벨 1~4를 선택할 수 있습니다. 레벨이 높을수록 인증 시 PIN과 같은 추가적인 정보를 요구할 수 있습니다. [그림 1]에서 'Sign in with Google'을 통해 인증할 경우 추가적으로 인증번호를 물어오는데 이는 레벨 2를 지정하여 사용하는 것으로 유추됩니다.

4. 유연성

OP에 직접 요청을 할 수 있는 Normal 타입, JWT를 이용하여 서명된 데이터 소스를 모두 OP를 통해 전달하는 Aggregated 타입, 데이터 소스를 RP(Relying Party)에서 직접 Access 토큰을 사용하여 전달받는 Distributed 타입이 있으며, 이 중 하나가 아닌 여러 타입을 결합한 하이브리드 형태로도 사용할 수 있습니다.

ref

https://openid.net/specs/openid-connect-core-1_0.html

https://www.youtube.com/watch?v=uUxD1uF244E

공식 - https://openid.net/developers/how-connect-works/

영상 - https://www.youtube.com/watch?v=uUxD1uF244E

https://blog.logto.io/ko/exploring-oidc-configuration

https://hudi.blog/open-id/

https://sabarada.tistory.com/264

https://devocean.sk.com/blog/techBoardDetail.do?ID=165453&boardType=techBlog

https://www.samsungsds.com/kr/insights/oidc.html

More from this blog

SSM으로 private DB에 안전하게 연결

SSE를 통해 private DB를 외부에 노출하지 않고 접근할 수 있는 방법을 알아보겠습니다. private Instance에 접근하기 중요한 데이터와 비즈니스 로직이 들어있는 Instance들의 경우에는 보안을 위해 인터넷에 노출시키지 않고 사설망에 두고 운영하는 경우가 많습니다. 사설망에 있는 Instance들을 private Instance라고 합니다. 인터넷에 노출되지 않아 보안이 강력해지지만 관리자들도 접근할 수 없게되어 privat...

Sep 12, 20254 min read
SSM으로 private DB에 안전하게 연결

PKCE & OAuth 2.1

기존의 OAuth 2.0을 보완하기 위한 여러 시도가 있습니다. 그 중 PKCE 그리고 더 발전된 형태인 OAuth 2.1에 대해 간략히 알아보겠습니다. PKCE (Proof Key for Code Exchange) PKCE는 악의적인 애플리케이션이 인증 코드를 가로채는 것을 방지하는 방법에 대한 내용입니다. OAuth 2.0 인증과정 중 Authorization code가 탈취 OAuth 2.0의 흐름 중 다음과 같은 과정이 있습니다. Re...

Sep 11, 20252 min read
PKCE & OAuth 2.1

OAuth 2.0

OAuth 2.0 프로토콜은 외부 서비스의 권한 위임에 위해 사용되는 프로토콜입니다. OAuth 2.0 RFC 공식 문서 OAuth2.0은 왜 필요했을까? 일반 사용자들이 앱을 통해서 Google이나 제 3자 서비스들에 저장된 자기 정보에 접근하기 위해서 가장 간단한 방법은 제 3자 서비스의 비밀번호를 앱에 공유하는 것입니다. 하지만, 이러면 "앱"은 사용자들의 제 3자 서비스 계정의 비밀번호를 알게 되고 관리해야하며, 이는 보안상 중요한 정보...

Sep 11, 20253 min read
OAuth 2.0

관찰 가능성 시스템 구현기 2 - 구축과 적용

이번 포스팅에선 정의한 문제를 해결하기 위해 관찰 가능성 시스템을 구축하고 적용하기 위한 과정과 어떤 효과가 있었는지에 대해 공유하고자 합니다. 서론 일전엔 러프하게 Grafana 생태계를 고려한다고 했지만, 구체적으로 무엇을 어떻게 구현할지는 아직 정하지 않았으며 어떤 인프라를 이용해 구현할지도 아직 정하지 않았습니다. 구체적인 선택의 과정과 구현 과정을 공유하고자 합니다. 또한, 이 완성된 시스템이 조직의 논의를 통해 점진적으로 적용되는 과...

Sep 9, 20255 min read
관찰 가능성 시스템 구현기 2 - 구축과 적용
K

KyungJun Woo | Software Engineer

30 posts