728x90
PKCE(Proof Key for Code Exchange, RFC - 6749) 개요
- 코드 교환을 위한 증명 키로서 CSRF 및 권한부여코드 삽입 공격을 방지하기 위한 Authorization Code Grant Flow의 확장버전이다.
- 권한부여코드 요청 시 Code Verifier와 Code Challenge를 추가하여 만약 Authorization Code Grant Flow에서 Authrozization Code 가 탈취당했을 때 Access Token을 발급하지 못하도록 차단한다.
- PKCE는 원래 모바일 앱에서 Authorization Code Grant Flow를 보호하도록 설계되었으며 나중에 단일 페이지 앱에서도 사용하도록 권장되으며 모든 유형의 OAuth2 클라이언트, 심지어 클라이언트 암호를 사용하는 웹 서버에서 실행되는 앱에도 유용하다
코드 생성
- Code Verifier
- 권한부여코드 요청 전에 앱이 원래 생성한 PKCE 요청에 대한 코드 검증기
- 48 ~ 128 글자수를 가진 무작위 문자열
- A-Z a-z 0-9 -._~ 의 ASCII 문자들로만 구성됨
- Code Challenge
- 선택한 Hash 알고리즘으로 Code Verifier를 Hashing 한 후 Base64 인코딩을 한 값
- ex) Base64 Encode(Sha256(ASCII(Code Verifier)))
- 선택한 Hash 알고리즘으로 Code Verifier를 Hashing 한 후 Base64 인코딩을 한 값
- Code Challenge Method
- plain – Code Verifier 가 특정한 알고리즘을 사용하지 않도록 설정
- S256 – Code Verifier 해시 알고리즘 사용하도록 설정
처리 흐름(1~6 = Code 발급, 7~11 = Access Token)
- 클라이언트는 code_verifier를 생성하고, code_challenge_method를 사용하여 code_challenge를 계산한다.
- 클라이언트가 /authorize에 대한 요청을 작성한다.
- 권한 서버가 /authorize에 대한 표준 OAuth2 요청 유효성 검증을 수행한다.
- 권한 서버가 code_challenge 및 code_challenge_method의 존재를 확인한다.
- 권한 서버가 권한 코드에 대해 code_challenge 및 code_challenge_method를 저장한다.
- 권한 서버가 권한 코드 응답을 리턴한다.
- 클라이언트가 추가 code_verifier를 포함해 권한 코드를 /token에 제공한다.
- 권한 서버가 /token에 대한 표준 OAuth2 요청 유효성 검증을 수행한다.
- 권한 서버가 제공된 code_verifier 및 저장된 code_challenge_method를 사용하여 고유 code_challenge를 생성한다.
- 권한 서버가 생성된 code_challenge를 /authorize에 대한 초기 요청에 제공된 값과 비교한다.
- 두 값이 일치하면 액세스 토큰이 발행되고 일치하지 않으면 요청이 거부된다.
code_challenge_method 검증
- 권한 부여 코드 흐름에 있어 인가서버는 code_verifier를 검증하기 위해 code_challenge_method을 이미 알고 있어야 한다
- 토큰 교환 시 code_challenge_method 가 plain 이면 인가서버는 전달된 code_verifier와 보관하고 있는 code_challenge 문자열과 단순히 일치하는지 확인만 하면 된다
- code_challenge_method 가 S256이면 인가서버는 전달된 code_verifier를 가져와서 동일한 S256 해시 메서드를 사용하여 변환한 다음 보관된 code_challenge 문자열과 비교해서 일치 여부를 판단한다
동작 과정


TEST
code_chellenge를 생성하는 사이트
https://tonyxu-io.github.io/pkce-generator/
Online PKCE Generator Tool
Online PKCE Generator Tool An online tool to generate code verifier and code challenge for OAuth with PKCE.
tonyxu-io.github.io


728x90
'스프링 시큐리티 OAuth2 > OAuth 2.0 권한부여 유형' 카테고리의 다른 글
| Refresh Token Grant (0) | 2023.01.09 |
|---|---|
| Client Credentials Grant Type - 클라이언트 자격증명 승인 방식 (0) | 2023.01.09 |
| Resource Owner Password Credentials Grant Type - 패스워드 자격증명 승인 방식 (0) | 2023.01.09 |
| Implicit Grant Type - 암묵적 승인 방식 (0) | 2023.01.08 |
| Authorization Code Grant Type - 권한 부여 코드 승인 방식 (0) | 2023.01.08 |