π[μ€νλ§ μνλ¦¬ν° OAuth2] OAuth 2.0 Grant Types
κ°μ
κΆν λΆμ¬ μ ν
- κΆνλΆμ¬λ ν΄λΌμ΄μΈνΈκ° μ¬μ©μλ₯Ό λμ ν΄μ μ¬μ©μμ μΉμΈνμ μΈκ°μλ²λ‘λΆν° κΆνμ λΆμ¬λ°λ κ²μ μλ―Ένλ€
- OAuth 2.0 λ©μ»€λμ¦μ μλμ κ°μ κΆν λΆμ¬ μ νλ€μ μ§μνκ³ μμΌλ©° μΌλΆλ Depreacted λμλ€
- Authorization Code Grant Type
- κΆν μ½λ λΆμ¬ νμ , μλ² μ¬μ΄λ μ΄ν리μΌμ΄μ (μΉ μ΄ν리μΌμ΄μ ), 보μμ κ°μ₯ μμ ν μ ν
- Implicit Grant Type (Deprecated)
- μμμ λΆμ¬ νμ , κ³΅κ° ν΄λΌμ΄μΈνΈ μ΄ν리μΌμ΄μ (SPA κΈ°λ° μλ°μ€ν¬λ¦½νΈ μ±, λͺ¨λ°μΌ μ±), 보μμ μ·¨μ½
- Resource Owner Password Credentials Grant Type (Deprecated)
- 리μμ€ μ¬μ©μ λΉλ°λ²νΈ μ격μ¦λͺ λΆμ¬ νμ , μλ² μ΄ν리μΌμ΄μ , 보μμ μ·¨μ½
- Client Credentials Grant Type
- ν΄λΌμ΄μΈνΈ μ격 μ¦λͺ κΆν λΆμ¬ νμ , UI or νλ©΄μ΄ μλ μλ² μ΄ν리μΌμ΄μ
- Refresh Token Grant Type
- μλ‘κ³ μΉ¨ ν ν° λΆμ¬ νμ , Authorization Code, Resource Owner Password Type μμ μ§μ
- PKCE-enhanced Authorization Code Grant Type
- PKCE κΆν μ½λ λΆμ¬ νμ , μλ² μ¬μ΄λ μ΄ν리μΌμ΄μ , κ³΅κ° ν΄λΌμ΄μΈνΈ μ΄ν리μΌμ΄μ
κΆν λΆμ¬ νλ¦ μ ν κΈ°μ€
λ§€κ° λ³μ μ©μ΄
- client_id
- μΈκ°μλ²μ λ±λ‘λ ν΄λΌμ΄μΈνΈμ λν΄ μμ±λ κ³ μ ν€
- client_secret
- μΈκ°μλ²μ λ±λ‘λ νΉμ ν΄λΌμ΄μΈνΈμ client_id μ λν΄ μμ±λ λΉλ° κ°
- response_type
- μ ν리μΌμ΄μ μ΄ κΆν λΆμ¬ μ½λ νλ¦μ μμνκ³ μμμ μΈμ¦ μλ²μ μλ €μ€λ€
- code, token, id_token μ΄ μμΌλ©° token, id_token μ implicit κΆνλΆμ¬μ νμμ μ§μν΄μΌ νλ€
- μλ²κ° 쿼리 λ¬Έμμ΄μ μΈμ¦ μ½λ(code), ν ν°(token, id_token) λ±μ λ°ν
- grant_type
- κΆν λΆμ¬ νμ μ§μ - authorization_code, password, client_credentials, refresh_token
- redirect_uri
- μ¬μ©μκ° μμ© νλ‘κ·Έλ¨μ μ±κ³΅μ μΌλ‘ μΉμΈνλ©΄ κΆν λΆμ¬ μλ²κ° μ¬μ©μλ₯Ό λ€μ μμ© νλ‘κ·Έλ¨μΌλ‘ 리λλ μ νλ€
- redirect_uri κ° μ΄κΈ° κΆν λΆμ¬ μμ²μ ν¬ν¨λ κ²½μ° μλΉμ€λ ν ν° μμ²μμλ μ΄λ₯Ό μꡬν΄μΌ νλ€.
- ν ν° μμ²μ redirect_uri λ μΈμ¦ μ½λλ₯Ό μμ±ν λ μ¬μ©λ redirect_uri μ μ νν μΌμΉν΄μΌ νλ€. κ·Έλ μ§ μμΌλ©΄ μλΉμ€λ μμ²μ κ±°λΆν΄μΌ νλ€.
- scope
- μ΄ν리μΌμ΄μ μ΄ μ¬μ©μ λ°μ΄ν°μ μ κ·Όνλ κ²μ μ ννκΈ° μν΄ μ¬μ©λλ€ β email profile read write..
- μ¬μ©μμ μν΄ νΉμ μ€μ½νλ‘ μ νλ κΆν μΈκ°κΆμ λ°νν¨μΌλ‘μ¨ λ°μ΄ν° μ κ·Όμ μ ννλ€
- state
- μμ© νλ‘κ·Έλ¨μ μμμ λ¬Έμμ΄μ μμ±νκ³ μμ²μ ν¬ν¨νκ³ μ¬μ©μκ° μ±μ μΉμΈν ν μλ²λ‘λΆν° λμΌν κ°μ΄ λ°νλλμ§ νμΈν΄μΌ νλ€.
- μ΄κ²μ CSRF 곡격 μ λ°©μ§νλ λ° μ¬μ©λλ€
Authorization Code Grant Type
κ°μ
- νλ¦ λ° νΉμ§
- μ¬μ©μκ° μ ν리μΌμ΄μ μ μΉμΈνλ©΄ μΈκ°μλ²λ Redirect URI λ‘ μμ μ½λ λ΄μμ μ ν리μΌμ΄μ μΌλ‘ λ€μ 리λ€μ΄λ μ νλ€
- μ ν리μΌμ΄μ μ ν΄λΉ μμ μ½λλ₯Ό μΈκ°μλ²λ‘ μ λ¬νκ³ μ‘μΈμ€ ν ν°μΌλ‘ κ΅ννλ€
- μ ν리μΌμ΄μ μ΄ μ‘μΈμ€ ν ν°μ μμ²ν λ ν΄λΉ μμ²μ ν΄λΌμ΄μΈνΈ μνΈλ‘ μΈμ¦ν μ μμΌλ―λ‘ κ³΅κ²©μκ° μΈμ¦ μ½λλ₯Ό κ°λ‘μ±μ μ€μ€λ‘ μ¬μ©ν μνμ΄ μ€μ΄λ¬
- μ‘μΈμ€ ν ν°μ΄ μ¬μ©μ λλ λΈλΌμ°μ μ νμλμ§ μκ³ μ ν리μΌμ΄μ μ λ€μ μ λ¬νλ κ°μ₯ μμ ν λ°©λ²μ΄λ―λ‘ ν ν°μ΄ λ€λ₯Έ μ¬λμκ² λμΆλ μνμ΄ μ€μ΄λ¬
- κΆνλΆμ¬μ½λ μμ² μ λ§€κ°λ³μ
- response_type=code (νμ)
- client_id (νμ)
- redirect_uri (μ νμ¬ν)
- scope (μ νμ¬ν)
- state (μ νμ¬ν)
- μ‘μΈμ€ν ν° κ΅ν μμ² μ λ§€κ°λ³μ
- grant_type=authorization_code (νμ)
- code (νμ)
- redirect_uri (νμ : 리λ€μ΄λ μ URLμ΄ μ΄κΈ° μΉμΈ μμ²μ ν¬ν¨λ κ²½μ°)
- client_id (νμ)
- client_secret (νμ)
νλ¦
- authorization code μμ² : μΈκ°μλ²μκ² code λ₯Ό μμ²νλ€
- μ¬μ©μ μΈμ¦ & λμνκΈ° : μ¬μ©μμ μΉμΈ λ° λμνμ μΈκ°μλ²κ° ν΄λΌμ΄μΈνΈμκ² μ½λλ₯Ό λ°κΈνλ€
- Redirect λ° Access Token κ΅ν μμ² : ν΄λΌμ΄μΈνΈμ κΆν λΆμ¬κ° μΉμΈλκ³ κ·Έ κ²°κ³Όλ‘ ν ν°μ νλνλ€
Implicit Grant
κ°μ
- νλ¦ λ° νΉμ§
- ν΄λΌμ΄μΈνΈμμ Javascript λ° HTML μμ€ μ½λλ₯Ό λ€μ΄λ‘λν ν λΈλΌμ°μ λ μλΉμ€μ μ§μ API μμ²μ νλ€
- μ½λ κ΅ν λ¨κ³λ₯Ό 건λλ°κ³ λμ μ‘μΈμ€ ν ν°μ΄ 쿼리 λ¬Έμμ΄ μ‘°κ°μΌλ‘ ν΄λΌμ΄μΈνΈμ μ¦μ λ°νλ©λλ€.
- μ΄ μ νμ back channel μ΄ μμΌλ―λ‘ refresh token μ μ¬μ©νμ§ λͺ»νλ€.
- ν ν° λ§λ£ μ μ΄ν리μΌμ΄μ μ΄ μλ‘μ΄ access tokenμ μ»μΌλ €λ©΄ λ€μ OAuth μΉμΈ κ³Όμ μ κ±°μ³μΌ νλ€
- κΆν λΆμ¬ μΉμΈ μμ² μ λ§€κ°λ³μ
- response_type=token (νμ), id_token
- client_id (νμ)
- redirect_uri (νμ)
- scope (μ νμ¬ν)
- state (μ νμ¬ν)
νλ¦
- Access Token μμ²
Resource Owner Password Credentials Grant
κ°μ
- νλ¦ λ° νΉμ§
- μ ν리μΌμ΄μ μ΄ μ¬μ©μ μ΄λ¦κ³Ό μνΈλ₯Ό μ‘μΈμ€ ν ν°μΌλ‘ κ΅νν λ μ¬μ©λλ€.
- νμ¬ μ΄ν리μΌμ΄μ μ΄ μ΄ κΆνμ μ¬μ©νλλ‘ νμ©ν΄μλ μλκ³ κ³ λμ μ λ’°ν μμ¬ μ΄ν리μΌμ΄μ μμλ§ μ¬μ©ν΄μΌ νλ€.
- κΆν λΆμ¬ μΉμΈ μμ² μ λ§€κ°λ³μ
- grant_type=password (νμ)
- username (νμ)
- password (νμ)
- client_id (νμ)
- client_secret (νμ)
- scope (μ νμ¬ν)
νλ¦
- Access Token μμ²
Client Credentials Grant
κ°μ
- νλ¦ λ° νΉμ§
- μ ν리μΌμ΄μ μ΄ λ¦¬μμ€ μμ μμΈ λμμ ν΄λΌμ΄μΈνΈμ μν μ νλ€
- 리μμ€ μμ μμκ² κΆν μμ λ°μ 리μμ€μ μ κ·Όνλ κ²μ΄ μλλΌ μκΈ° μμ μ΄ μ ν리μΌμ΄μ μ μ¬μ©ν λͺ©μ μΌλ‘ μ¬μ©νλ κ²
- μλ² λ μλ²κ°μ ν΅μ μμ μ¬μ©ν μ μμΌλ©° IOT μ κ°μ μ₯λΉ μ΄ν리μΌμ΄μ κ³Όμ ν΅μ μ μν μΈμ¦μΌλ‘λ μ¬μ©ν μ μλ€.
- Client Id μ Client Secret μ ν΅ν΄ μ‘μΈμ€ ν ν°μ λ°λ‘ λ°κΈ λ°μ μ μκΈ° λλ¬Έμ Refresh Token μ μ 곡νμ§ μλλ€
- Client μ 보λ₯Ό κΈ°λ°μΌλ‘ νκΈ° λλ¬Έμ μ¬μ©μ μ 보λ₯Ό μ 곡νμ§ μλλ€.
- κΆν λΆμ¬ μΉμΈ μμ² μ λ§€κ°λ³μ
- grant_type=client_credentials (νμ)
- client_id (νμ)
- client_secret (νμ)
- scope (μ νμ¬ν)
νλ¦
- Access Token μμ²
Refresh Token Grant
κ°μ
- νλ¦ λ° νΉμ§
- μ‘μΈμ€ ν ν°μ΄ λ°κΈλ λ ν¨κ» μ 곡λλ ν ν°μΌλ‘μ μ‘μΈμ€ ν ν°μ΄ λ§λ£λλλΌλ ν¨κ» λ°κΈλ°μλ 리νλ μ ν ν°μ΄ μ ν¨νλ€λ©΄, μΈμ¦ κ³Όμ μ μ²μλΆν° λ°λ³΅νμ§ μμλ μ‘μΈμ€ ν ν°μ μ¬λ°κΈ λ°μΌμ€ μ μμ΅λλ€.
- ν λ² μ¬μ©λ 리νλ μ ν ν°μ νκΈ°λκ±°λ μ¬μ¬μ© ν μ μλ€
- κΆν λΆμ¬ μΉμΈ μμ² μ λ§€κ°λ³μ
- grant_type=refresh_token (νμ)
- refresh_token (νμ)
- client_id (νμ)
- client_secret (νμ)
νλ¦
- Refresh Token μμ²
PKCE-enhanced Authorization Code Grant
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) Base64Encode(Sha256(ASCII(Code Verifier))) - Code Challenge Method
β plain β Code Verifier κ° νΉμ ν μκ³ λ¦¬μ¦μ μ¬μ©νμ§ μλλ‘ μ€μ
β‘ S256 β Code Verifier ν΄μ μκ³ λ¦¬μ¦ μ¬μ©νλλ‘ μ€μ
μ²λ¦¬ νλ¦
- ν΄λΌμ΄μΈνΈλ 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 λ¬Έμμ΄κ³Ό λΉκ΅ν΄μ μΌμΉ μ¬λΆλ₯Ό νλ¨νλ€
νλ¦
- authorization code μμ²
- Redirect λ° Access Token κ΅ν μμ²
λκΈλ¨κΈ°κΈ°