OAuth 2.0
Last updated
Last updated
OAuth 2.0
μΈκ° νλ μ μν¬
μλ²μμ μ¬μ©μμ μλΉμ€ κΆνμ νμΈ
κΆνμ΄ μμΌλ©΄, μΈκ°κ° νμνλ€λ μλ¦Όμ μ¬μ©μμκ² λ Έν°
μ¬μ©μλ μλΉμ€μ μΈκ° μμ²
μλΉμ€λ μΈκ°κ° μλ£λμλ€λ μμ μ½λλ₯Ό λ°κΈ
μ¬μ©μλ λ°μ μμ μ½λλ₯Ό μλ²μ μ λ¬
μλ²λ μ΄ μ½λλ₯Ό μ΄μ©ν΄ μλΉμ€ μ κ·Ό κΆνμ κ°λ ν ν°μ μμ±νκ³ μ μ₯
μ¬μ©μλ ν΄λΉ ν ν°μ ν΅ν΄ μλΉμ€λ₯Ό μ΄μ©
μΈμ¦ ν ν°μ μ»κΈ° μν΄μ ν΄λΌμ΄μΈνΈ(μλ²)μκ² μμ²
ν΄λΌμ΄μΈνΈκ° μ±μ΄λ λΈλΌμ°μ λ₯Ό λ§μ΄ κ°λ¦¬μΌμ ν·κ°λ¦΄ μ μμ. OAuth 2.0 μΈκ° κ³Όμ μμ μ£Όμ²΄κ° λλ κ²μ κ°λ¦¬ν€λ λ§
μΈκ°λ₯Ό μμνλ©΄ μλ²λ μΈμ¦μ ν΄μΌν μμΉλ‘ 리λ€μ΄λ νΈ μλ΅μ 보λ
μμΉμλ μΈκ°μ νμν νλΌλ―Έν°λ€μ μΆκ°
client_id
: ν΄λΌμ΄μΈνΈμ μλ³μ
response_type
: μ΄λ€ μΈκ° λ°©λ²μΌλ‘ 보λΌμ§ λͺ
μ.
code
λ OAuth 2.0μ κ°μ₯
κΈ°λ³Έμ μΈ λ°©λ²μΈ μΈκ° μ½λ νλ‘μ°λ₯Ό λ»ν¨.
scope
: μΈκ°ν μ κ·Ό κΆν
redirect_uri
: μΈκ°λ₯Ό λ§μΉ ν λ€μ λμμ¬ URL
리λ€μ΄λ νΈ μλ΅μ λ°μ λΈλΌμ°μ λ ν΄λΉ LocationμΌλ‘ 리λ€μ΄λ νΈ.
μΈκ° μλ²λ μ¬μ©μκ° μΈμ¦ν μ μλ νμ΄μ§λ₯Ό 보μ¬μ€λλ€.
μΈμ¦μ΄ μλ£λμλ€λ©΄ λΈλΌμ°μ μμ μ κ·Ό κΆνμ νμΈνκ³ μ¬μ©μκ° μΉμΈ
μΈκ° μλ²μμ μΉμΈμ΄ μλ£λλ©΄ μΈκ° μ½λλ₯Ό λ°κΈνμ¬ μ²μ μμ²ν λ μ μ‘νλ redirect_uri
λ€μ μΆκ°μ μΈ μΏΌλ¦¬ νλΌλ―Έν°λ₯Ό μΆκ°ν΄μ λΈλΌμ°μ μκ² λ¦¬λ€μ΄λ νΈ μλ΅μ 보λ
리λ€μ΄λ νΈ μλ΅μ λ°μ λΈλΌμ°μ λ LocationμΌλ‘ κ·Έλλ‘ λ¦¬λ€μ΄λ νΈ
μμ²μ λ°μ ν΄λΌμ΄μΈνΈ μλ²λ μ λ¬λ°μ code
μ client_id
κ·Έλ¦¬κ³ client_secret
μ κ°μ΄ μΈκ° μλ²μ μ μ‘νμ¬ ν ν°μ λ°κΈ
μΈκ° μλ²λ μ΄λ₯Ό κ²μ¦νκ³ λ¬Έμ κ° μλ€λ©΄ μ κ·Ό κΆν ν ν°μ μλ΅
μ¬μ©μκ° μλνμ§ μμ νλμ νλλ‘ νμ¬ μΈμ μ νμ·¨νκ±°λ 곡격μμ μΈμ μ μ§μ΄ λ£λ 곡격
OAuthλ λ κ°μ§μ μ±λμ μ¬μ©
리λ€λ νΈλ₯Ό ν΅ν΄μ μΈκ° μλ²λ‘ νμν λ°μ΄ν°λ₯Ό μ μ‘νκ³ , μΈκ° μ½λλ 리λ€λ νΈλ₯Ό ν΅ν΄μ μ λ¬
νλ‘ νΈ μ±λμ μ΄μ©νλ μ΄μ λ μ¬μ©μκ° μ 3μ μλΉμ€(μΈκ° μλ²)μ μ§μ μΈμ¦μ ν΄μΌ νκΈ° λλ¬Έ
νλ‘ νΈ μ±λμ ν΅ν΄ μ μ‘λλ λͺ¨λ μ 보λ 곡κ°λκ³ μ μΆλ μ μκΈ°μ μ μ ν 보νΈνμ§ μλλ€λ©΄ μ¬μ©μμ μ λ³΄κ° μνμ λ ΈμΆλλ€.
client_id, scope(μ κ·Ό κΆν), redirect_uri, code(μΈκ° μ½λ) λͺ¨λκ° κ³΅κ°λκΈ° λλ¬Έμ κ°κ°μ μ μ νκ² λ³΄νΈν΄μΌ νλ€.
λΈλΌμ°μ νμ€ν 리, μμ΄μ΄ μ€ν¬ ν¨ν· λΆμκΈ° λ±
URLμ μνΈνκ° μλκΈ° λλ¬Έ
scope: κΆνμ λνλ
Github OAuthμ κ²½μ° μ²μ λ±λ‘ν λμ κΆνκ³Ό λ€λ₯΄λ©΄ κ±°μ νλ λ±μΌλ‘ μ²λ¦¬
client_id μλ³μ
κ°μ§ μ¬μ΄νΈλ₯Ό λ§λ€μ΄ νμ©λ client_idλ₯Ό κ°μ Έμ μΈμ¦νλλ‘ νλ©΄ λ§μΉ λ΄κ±°μΈκ±°λ§λ μμ΄λλ₯Ό νλ΄λΌ μ μμ
client_secretμ backend chanelλ‘λ§ μ μ‘λκ³ λ―Έλ¦¬ λ±λ‘νκΈ° λλ¬Έμ ν ν°μ κ΅ννλ κ³Όμ μμ ν΄λΉ λ°μ΄ν°λ₯Ό κ°μ§κ³ client_id μ£ΌμΈ μλ³κ°λ₯
redirect_uri: codeλ₯Ό μ»κ³ λμ μ΄λλ‘ λμμ¬μ§μ λν λ°μ΄ν°
μ μμ μΌλ‘ κ²½λ‘λ₯Ό λ°κΎΌ μμ²μ 보λ΄μ μΈκ° μ½λλ₯Ό νμ·¨
redirect_mismatch -> μ²μ λ±λ‘λκ²κ³Ό λ€λ₯΄λ©΄ κ±°μ
μμ μΌμΉ κ²μ¬, νμ URL νμ©, λλ©μΈ κ²μ¬ λ± μ μ°νκ² μ²λ¦¬νκ² μ€μ ν μ μμ§λ§ 보μμ μΌλ‘λ μ·¨μ½ν΄μ§
code: ν ν°μ κ΅ννκΈ° μν μ½λ
μΈκ° μ½λλ μ μΌ μ€μν μ λ³΄λ‘ νμ·¨λμ΄μλ μλλ€.
κ·Έλμ μΈκ° μλ²λ ν λ² μ¬μ©ν μ½λλ λ λ² λ€μ μ¬μ©ν μ μλλ‘ νκΈ°ν΄μΌ νλ€
stateνλΌλ―Έν°λ₯Ό μΆκ°νμ¬ CSRF 곡격μ λ°©μ§
state: μκΈ° μ΄λ €μ΄ λ¬Έμμ΄, μμ²νμ¬λκ³Ό μΈκ°νμ¬λμ΄ κ°μμ§ νλ³ (CSRF λ°©μ§νκΈ° μν¨)
ν΄λΌμ΄μΈνΈ(μλ²)κ° μΈκ° μλ²λ‘ 리λ€μ΄λ νΈ νκΈ° μ μ μ¬μ©μμ μΈμ μ stateλΌλ μμμ λ³μλ₯Ό νλ μμ±ν΄μ κ°μ΄ μ λ¬
μΈκ° μλ²λ μΈκ° μ½λμ ν¨κ» stateλ₯Ό λ°μ κ·Έλλ‘ λλ €μ€μ μ²μμ μΈμ μ λ±λ‘νλ stateμ λΉκ΅
λ§μ½ μ΄ stateκ° μκ±°λ λ€λ₯΄λ€λ©΄ μμ²μ κ±°λΆ
stateλ₯Ό λ³κ²½ν΄μ 곡격νλλΌλ μλ²μ μΈμ μ μΈλΆμμ μ κ·Όν μ μκΈ° λλ¬Έμ 곡격μ λ°©μ§ν μ μλ€.
μ¬μ©μμλ μκ΄μμ΄ μμ€ν μ ν΅ν΄μ λ°μ΄ν°λ₯Ό μ λ¬
νλ‘ νΈ μ±λμ ν΅ν΄ λ°μ μΈκ° μ½λλ₯Ό μ΄μ©ν΄μ μ κ·Ό κΆν ν ν°μ μμ²
HTTPSλ₯Ό ν΅ν΄ μνΈνλ₯Ό μ΄μ©ν΄ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°κΈ° λλ¬Έμ λ°μ΄ν°κ° μ μΆλ κ°λ₯μ±μ΄ μ μ
OAuth 2.0μ΄ μ£Όλ‘ κ°νΈ λ‘κ·ΈμΈμ ꡬννκΈ° μν΄ μ¬μ©λλ€ λ³΄λ, μ¬λλ€μ OAuth 2.0μ μΈμ¦ νλ₯΄ν μ½μ΄λΌκ³ μκ°ν©λλ€. νμ§λ§ OAuth 2.0μ μΈμ¦ νλ‘ν μ½μ΄ μλλλ€.
OAuth 2.0μμ ν ν°μ λΆν¬λͺ ν©λλ€. 리μμ€μ μ κ·Όν μ μλ ν ν°μ μΈκ° μλ²μμ λ°μ κ·Έλλ‘ μ μ₯νκ³ κ·Έλλ‘ μ λ¬νμ¬ λ¦¬μμ€λ₯Ό μ»λ λ° μ°μ λλ€. μ΄ ν ν°μ΄ μ΄λ€ νμμΈμ§λ OAuth 2.0 μ체μμ μ μλμ΄ μμ§λ μμ΅λλ€. κ·Έλ¬λ€ 보λ μ΄ ν ν°μ λΆν¬λͺ νκ² κ΄λ¦¬λ©λλ€.
μ΄ ν ν°μ κ°μ§κ³ 무μΈκ°λ₯Ό ν μ μλ€κ³ ν΄μ κ·Έ μ¬λμ΄ νμΈλλ κ²μ μλλλ€. μλ₯Ό λ€μ΄μ μννΈ νκ΄ λ¬Έμ νλ°°κΈ°μ¬λλ€μ΄ μ΄ μ μλ€κ³ ν΄μ νλ°°κΈ°μ¬λμ΄ μ°λ¦¬ μννΈ μ£Όλ―Όμ΄ λλ κ²μ μλμ£ . μ°λ¦¬λ λ¨μν νλ°°λ₯Ό λ°κΈ° μν΄μ λ¬Έμ μ΄ μ μλ κΆνμ μΈκ°ν κ² λΏμ λλ€.
OAuthλ μΈκ°λ₯Ό μν νλ μμν¬, μΈμ¦μ λμ ν΄μ£ΌκΈ° μν΄ μ°λκ²μ μλ
μΈμ¦κ³Ό μΈκ°λ λ€λ₯΄λ€.
μ¬μ©μ μ 보λ₯Ό μ»μ μ μλλ‘ μΈκ°λ νμ§λ§ μΈμ¦μ μλ²μμ μ²λ¦¬ν΄μΌν¨
μ¦, OAuthλ μΈμ¦μ μνκ²μ΄ μλ μΈκ°λ₯Ό ν¨μΌλ‘μ¨ "μ΄κ±Έ ν μ μμΌλκΉ μ΄ μ¬λμ΄ λ§κ² μ§" μ λλ‘ νννλκ²
μ¬μ©μλ₯Ό μ»λκ² κΉμ§λ§ OAuth μλΉμ€λ₯Ό μ΄μ©νκ³ κ·Έκ±Έ κ°μ Έμμ μ°λ¦¬ λ°μ΄ν°μ μ¬μ©μκ° μ μ₯μ΄λλ©΄ μ΄νλΆν° ν΄λΉ λ°μ΄ν°λ‘ μ£Όκ³ λ°μ μΈμ¦μ²λ¦¬λ₯Ό ν¨
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λμ¨
μΈμ¦ νλ‘ν μ½
OpenID Connectλ OAuth 2.0 μΈκ° νλ μμν¬λ₯Ό νμ₯
λ€λ₯Έ μλΉμ€κ° μΈμ¦μ λμ μννλλ‘ νλ νλ‘ν μ½
OAuthλ₯Ό νμ₯νκ²μ΄λΌ ν ν°μ μ»λ κ³Όμ μ μμ ν λμΌν¨
ν ν°μ λ°μ λ μΈκ°μ κ΄λ ¨λ ν ν° λΏλ§ μλλΌ id_token
μ΄λΌκ³ ν΄μ μΈμ¦λ°μ ν ν°μ μΆκ°λ‘ λ°λλ€.
ν΄λΉ ν ν°μλ λκ° λ°ννκ³ μΈμ λ§λ£λλμ§, λꡬμΈμ§μ λν λ°μ΄ν°κ° JWT νμμΌλ‘ μ μ₯λμ΄μμ
ν΄λΉ ν ν°μ μλ²λ μ¬μ©μκ° κ΄λ¦¬νλ©΄ λ¨
JWT νμμ΄λΌ μ무λ λ§λ€ μ μμ§λ§ λꡬλ κ²μ¦μ΄ κ°λ₯νκΈ° λλ¬Έ