Open ID
OAuth 2.0 프로토콜을 확장한 인증 프로토콜입니다. 클라이언트 앱이 사용자의 정보(이메일, 프로필, 이름 등등)에 접근할 수 있도록 권한을 부여 받을 수 있습니다.
정의 : 사용자가 자신이 누구인지 확인하는 과정입니다.
방법 : 로그인, 지문 인식, OTP 등
-> 신원 확인
정의 : 인증된 사용자가 특정 자원이나 기능에 접근할 수 있는 권한을 부여받는 과정입니다.
방법 : 관리자 페이지 접근, 프리미엄 회원에게 제공하는 특수 기능
-> 권한 확인
인증은 사용자가 누구인지 확인하는 과정이고, 인가는 확인된 사용자 정보를 바탕으로 사용자가 무엇을 할 수 있는지 확인하는 과정입니다. 즉, 인증이 완료되어야만 인가가 가능해집니다.

OAuth 2.0이란?
리소스 소유자(실제 유저)로 부터 권한을 위임받은 클라이언트 애플리케이션이 리소스 서버에서 보호된 리소스에 접근할 수 있도록 허용하는 인가 프레임워크입니다. 즉 앱이 사용자의 자원에 접근할 수 있도록 권한을 부여하는 것입니다.
작동 방식은 다음과 같습니다.
1: 클라이언트(내 웹)가 리소스 소유자(실제 사용자)의 승인을 받아 인가 서버(=구글 OAuth)로부터 액세스 토큰을 발급 받습니다.
2: 클라이언트는 이 액세스 토큰을 사용하여 리소스 서버(=구글 드라이브)에 보호된 리소스에 접근합니다.
ODIC란?
OAuth 2.0을 기반으로한 인증 프로토콜입니다. OAuth 2.0의 인가 기능 외에도 사용자 인증을 처리합니다. 사용자의 신원을 확인하고 사용자 정보 (ID 토큰)을 안전하게 교환합니다.
작동 방식은 다음과 같습니다.
1: 사용자는 OpenID Connect Provider(Goolge, naver, kakao)(이하 OP)에 인증 요청을 보냅니다.
2: 인증이 성공하면 OP는 클라이언트에 ID 토큰과 액세스 토큰을 반환합니다.
3: 클라이언트는 ID 토큰을 사용해 사용자의 신원을 확인할 수 있습니다.
ID 토큰은 사용자가 인증되었음을 증명하는 결과물입니다. OIDC 요청시 access token과 함께 JWT 형태로 클라이언트에 전달됩니다. ID 토큰은 개인 키로 발급자가 서명하고, 앱은 공개 키로 ID 토큰의 유효성을 검사합니다. 또한 클라이언트는 클레임 정보에 포함되어 있는 사용자명, 이메일을 활용해 인증 관리를 할 수 있습니다.

| | 액세스 토큰 | ID 토큰 |
|---|---|---|
| 정의 | 리소스 서버에 접근할 수 있는 권한을 부여합니다. | 사용자의 신원 정보를 확인합니다. |
| 목적 | 내 앱이 사용자를 대신해 리소스 서버에 요청을 보낼때 | 내 앱이 사용자의 신원을 확인할 때 |
| 포맷 | 주로 JWT, 상황에 따라 구현 방식 변경 가능 | 무조건 JWT |
| 발급처 | 인가 서버 | OP, 인증 서버 |
Google OAuth와 OpenID Connect 예시
사용자가 클라이언트 애플리케이션에 Google 계정으로 로그인할 때, OpenID Connect를 통해 ID 토큰과 액세스 토큰을 발급받습니다.
ID 토큰: 클라이언트 애플리케이션이 사용자의 신원을 확인하는 데 사용됩니다(예: 사용자의 이메일 주소, 이름 등).
액세스 토큰: 클라이언트 애플리케이션이 Google 드라이브 API를 호출하여 사용자의 파일에 접근할 때 사용됩니다.
Facebook 로그인 예시
사용자가 모바일 애플리케이션에 Facebook 계정으로 로그인할 때, Facebook 인가 서버가 액세스 토큰을 발급합니다.
액세스 토큰: 애플리케이션이 Facebook Graph API를 통해 사용자의 친구 목록, 사진 등에 접근할 때 사용됩니다.
스코프는 클라이언트가 요청하는 권한의 범위를 지정하는 변수입니다. 클라이언트가 ID 토큰을 통해 접근할 수 있는 리소스와 정보를 명시적으로 제한하고 제어합니다. 공백으로 구분된 문자열의 리스트로 저장합니다.

| 스코프명 | 설명 |
|---|---|
| openid | 필수값입니다. 클라이언트가 OpenID Connect 요청을 하고 있음을 인증 서버에 알립니다. |
| profile | 기본 프로필 클레임에 대한 액세스 요청입니다. |
| 이메일 및 email_verified 클레임에 대한 액세스를 요청합니다. | |
| address | 주소 클레임에 대한 액세스 요청 |
| phone | phone_number, 및 phone_number_verified 클레임에 대한 액세스 요청 |
줄여서 OP라고 하며 OpenID 제공자로서 사용자를 인증하고 인증 결과와 사용자 정보를 신뢰 당사자에게 제공할 수 있는 OAuth 2.0 서버를 의미합니다.
줄여서 RP라고 하며 신뢰 당사자로서, 인증 요청을 처리하기 위해 OP에 의존하는 Oauth 2.0 애플리케이션을 의미합니다.
1: RP는 OP에 권한 부여 요청을 보냅니다.
2: OP는 최종 사용자를 인증하고 권한을 얻습니다.
3: OP는 권한을 ID 토큰과 액세스 토큰으로 응답합니다.
4: RP는 Access Token을 사용하여 User의 정보를 제공하는 API에 요청을 보낼 수 있습니다.
5: 유저의 정보를 제공하는 API는 최종 사용자에 대한 클레임을 반환합니다.

요청시 주의사항
1: 요청시 openid 범위를 scope에 포함합니다.
2: response_type은 id_token을 포함하며, response_type이 해당 토큰을 지원해야합니다.
3: 요청시 nonce를 포함해야합니다.
nonce란?
id_token 값에 클레임으로 포함되며, 토큰의 재생 공격을 방지하고 요청의 출처를 식별하는데 사용할 수 있는 고유 문자열입니다. 응답 nonce에는 요청에서 nonce와 같은 값이어야 합니다.