OAuth 2.0 Grant Type
권한부여란 클라이언트가 사용자를 대신하여 사용자의 승인 하에 인가서버로부터 권한을 부여 받는 것을 의미합니다.
| 유형명 | 설명 | Deperecated |
|---|---|---|
| Authorization Code Grant Type | 권한 코드 부여타입, 서버 사이드 앱, 보안에 가장 안전한 유형 | x |
| Implict Grat Type | 암시적 부여 타입, 공개 클라이언트 앱, 보안에 취약 | o |
| Resource Owner Password Client Grant Type | 리소스 사용자 비밀번호 자격증명 부여 타입, 서버 앱 | o |
| Client Credentials Grant Type | 클라이언트 자격 증명 권한 부여 타입, UI 또는 화면이 없는 서버 애플리케이션 | x |
| Refresh Token Grant Type | 새로 고침 토큰 부여 타입, Authorization Code, Resource Owner Password Type | x |
| PKCE-enhanced Authorization Code Grant Type | PCKE 권한 코드 부여 타입, 서버 사이드 애플리케이션, 공개 클라이언트 애플리케이션 | x |

| 이름 | 설명 |
|---|---|
| client_id | 인가 서버에 등록된 클라이언트에 대해 생성된 고유 키입니다. |
| client_secret | 인가 서버에 등록된 특정 클라이언트의 client_id에 대해 생성된 비밀값입니다. |
| response_type | 앱이 권한 부여 코드 흐름을 시작하고 있음을 인증서버에 알려줍니다. code, token, id_token이 있으며, token과 id_token은 implict 권한 부여 유형에서 지원해야합니다. 서버가 쿼리 문자열에 인증 코드(code)와 토큰(token, id_token) 등을 반환합니다. |
| grant_type | 권한 부여 타입을 지정합니다. authorization_code, password, client_credentials, refresh_token |
| redirect_url | 사용자가 앱의 요청을 성공적으로 승인하면, 권한 부여가 서버가 사용자를 다시 앱으로 리다이렉션한다. (앱->네이버로그인창->앱) |
| scope | 사용자의 데이터에 접근할 수 있는 범위를 설정합니다. (email, profile 등등) |
| state | 앱은 임의의 문자열을 생성하고 요청에 포함합니다. 요청 후 서버로부터 동일한 값이 반환되는지 확인합니다. CSRF 공격을 막을 수 있습니다. |
흐름
1: 인가서버에게 code를 요청

2: 사용자의 승인 후 인가서버가 클라이언트에게 코드를 발급한다.

3: 앱은 해당 임시 코드를 인가서버로 전달하고 액세스 토큰으로 교환한다.

특징
1: 앱이 액세스 토큰을 요청 시, 해당 요청을 클라이언트 암호로 인증할 수 있습니다.
-> 공격자가 인증 코드를 가로채 스스로 사용할 위험이 줄어듭니다.
2: 액세스 토큰이 클라이언트에 표시되지 않습니다.
-> 토큰이 다른 사람에게 노출될 확률이 줄어듭니다.
권한 부여 요청 시 필요한 매개변수
| 매개변수명 | 필수 여부 | 값 |
|---|---|---|
| response_type | 필수 | code |
| client_id | 필수 | |
| redirect_url | 선택 | |
| scope | 선택 | |
| state | 선택 | |
액세스 토큰 교환 요청 시 매개변수
| 매개변수명 | 필수여부 | 값 |
|---|---|---|
| grant_type | 필수 | authorization_code |
| code | 필수 | |
| redirect_url | 필수 | |
| client_id | 필수 | |
| client_secret | 필수 | |
코드 교환을 위한 증명 키로서 CSRF 및 권한부여코드 삽입 공격을 방지하기 위한 Authorization Code Grant Flow의 확장 버전입니다. 권한부여코드 요청 시 Code Verifier와 Code Challenge를 추가하여 만약 Authorization Code Grant Flow에서 Authorization Code가 탈취당했을 때, 액세스 토큰을 발급 받지 못하도록 차단합니다. 모든 유형의 OAuth2 클라이언트, 심지어 웹서버 양측 모두 유용합니다.
Code Verifier
권한부여코드 요청 전 앱이 원래 생성한 PKCE 요청에 대한 코드 검증기입니다. 48~128 글자수를 가진 무작위 문자열이며, A-Z,a-z,0-9의 아스키 문자로만 구성됩니다.
Code Challenge
선택한 Hash 알고리즘으로 Code Verifier를 Hashing한 후 Base64 인코딩을 한 값입니다.
Code Challenge Method
plain : Code Verifier가 특정한 알고리즘을 사용하지 않도록 설정합니다.
S256 : Code Verifier 해시 알고리즘을 사용하도록 설정합니다.