OAuth2λ‘ μμ νκ³ μνν μ¬μ©μ μΈμ¦μ νμ©νμΈμ. μ΄ κ°μ΄λλ νμ¬ μ‘μΈμ€λ₯Ό μν OAuth2 ꡬνμ μμΈν λ€λ£Ήλλ€.
OAuth2 ꡬν: νμ¬ μΈμ¦μ μν ν¬κ΄μ μΈ κ°μ΄λ
μ€λλ μνΈ μ°κ²°λ λμ§νΈ νκ²½μμ μννκ³ μμ ν μ¬μ©μ μΈμ¦μ λ§€μ° μ€μν©λλ€. OAuth2λ νμ¬ μ ν리μΌμ΄μ μ΄ μ¬μ©μ μ격 μ¦λͺ μ λ ΈμΆνμ§ μκ³ λ€λ₯Έ μλΉμ€μ μ¬μ©μ 리μμ€μ μ‘μΈμ€ν μ μλλ‘ νλ μ κ³ νμ€ νλ‘ν μ½λ‘ λΆμνμ΅λλ€. μ΄ ν¬κ΄μ μΈ κ°μ΄λλ OAuth2 ꡬνμ 볡μ‘μ±μ νν€μ³ κ°λ°μκ° μ΄ κ°λ ₯ν κΆν λΆμ¬ νλ μμν¬λ₯Ό μ ν리μΌμ΄μ μ ν΅ν©νλ λ° νμν μ§μκ³Ό μ€μ©μ μΈ μ§μΉ¨μ μ 곡ν©λλ€.
OAuth2λ 무μμΈκ°μ?
OAuth2(Open Authorization)λ νμ¬ μ ν리μΌμ΄μ μ΄ μ¬μ©μλ‘λΆν° λλ μ¬μ©μ μΉμΈμ μ€κ°νκ±°λ νμ¬ μ ν리μΌμ΄μ μ΄ μ체μ μΌλ‘ μ‘μΈμ€ κΆνμ μ»λλ‘ νμ¬, HTTP μλΉμ€μ λν μ νλ μ‘μΈμ€ κΆνμ μ»μ μ μλλ‘ νλ κΆν λΆμ¬ νλ μμν¬μ λλ€. OAuth2λ μΉ μ ν리μΌμ΄μ , λ°μ€ν¬ν± μ ν리μΌμ΄μ , ν΄λν° λ° κ±°μ€ μ₯μΉμ λν νΉμ κΆν λΆμ¬ νλ¦μ μ 곡νλ©΄μ ν΄λΌμ΄μΈνΈ κ°λ°μμ λ¨μμ±μ μ€μ μ λ‘λλ€.
λ°λ ννΉμ΄λΌκ³ μκ°ν΄λ³΄μΈμ. μ λ’°ν μ μλ λ°λ (νμ¬ μ ν리μΌμ΄μ )μκ² μλμ°¨ ν€(μ격 μ¦λͺ )λ₯Ό 건λ€μ£Όλ©΄, μλμ°¨ μμ λͺ¨λ κ²μ μ§μ μ‘μΈμ€ κΆνμ μ£Όμ§ μκ³ λ μλμ°¨λ₯Ό μ£Όμ°¨ν μ μμ΅λλ€(리μμ€μ μ‘μΈμ€). μ¬μ©μλ ν΅μ κΆμ μ μ§νλ©° μΈμ λ μ§ ν€λ₯Ό λμ°Ύμ μ μμ΅λλ€(μ‘μΈμ€ κΆν μ·¨μ).
OAuth2μ ν΅μ¬ κ°λ
μ±κ³΅μ μΈ κ΅¬νμ μν΄μλ OAuth2μ ν΅μ¬ κ°λ μ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€:
- 리μμ€ μμ μ: 보νΈλ 리μμ€μ λν μ‘μΈμ€ κΆνμ λΆμ¬ν μ μλ μν°ν°. μΌλ°μ μΌλ‘ μ΅μ’ μ¬μ©μμ λλ€.
- 리μμ€ μλ²: 보νΈλ 리μμ€λ₯Ό νΈμ€ν νλ μλ²λ‘, μ‘μΈμ€ ν ν°μ μ¬μ©νμ¬ λ³΄νΈλ 리μμ€ μμ²μ μλ½νκ³ μλ΅ν©λλ€.
- ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ : 리μμ€ μμ μλ₯Ό λμ νμ¬ λ³΄νΈλ 리μμ€μ λν μ‘μΈμ€λ₯Ό μμ²νλ μ ν리μΌμ΄μ . μΉ μ ν리μΌμ΄μ , λͺ¨λ°μΌ μ± λλ λ°μ€ν¬ν± μ ν리μΌμ΄μ μ΄ λ μ μμ΅λλ€.
- κΆν λΆμ¬ μλ²: 리μμ€ μμ μλ₯Ό μ±κ³΅μ μΌλ‘ μΈμ¦νκ³ ν΄λΉ μΉμΈμ λ°μ ν ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ μ‘μΈμ€ ν ν°μ λ°κΈνλ μλ²μ λλ€.
- μ‘μΈμ€ ν ν°: ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ 리μμ€ μμ μκ° λΆμ¬ν κΆνμ λνλ΄λ μ격 μ¦λͺ μ λλ€. ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ΄ λ¦¬μμ€ μλ²μμ 보νΈλ 리μμ€μ μ‘μΈμ€νλ λ° μ¬μ©λ©λλ€. μ‘μΈμ€ ν ν°μ μΌλ°μ μΌλ‘ μλͺ μ΄ μ νμ μ λλ€.
- μλ‘κ³ μΉ¨ ν ν°: 리μμ€ μμ μκ° ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ λ€μ μΉμΈν νμ μμ΄ μ μ‘μΈμ€ ν ν°μ μ»λ λ° μ¬μ©λλ μ격 μ¦λͺ μ λλ€. μλ‘κ³ μΉ¨ ν ν°μ μΌλ°μ μΌλ‘ μλͺ μ΄ κΈΈλ©° μμ νκ² λ³΄κ΄ν΄μΌ ν©λλ€.
- λ²μ: ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ λΆμ¬λ νΉμ κΆνμ μ μν©λλ€. μλ₯Ό λ€μ΄, ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ μ¬μ©μ νλ‘νμ λν μ½κΈ° μ μ© μ‘μΈμ€ κΆνμ μ»μ μ μμ§λ§ νλ‘νμ μμ ν μλ μμ΅λλ€.
OAuth2 κΆν λΆμ¬ μ ν
OAuth2λ λ€μν μ¬μ© μ¬λ‘μ 보μ μꡬ μ¬νμ λ§μΆ° μ¬λ¬ κΆν λΆμ¬ μ νμ μ μν©λλ€. μμ νκ³ μ¬μ©μ μΉνμ μΈ μΈμ¦ νκ²½μ 보μ₯νλ €λ©΄ μ μ ν κΆν λΆμ¬ μ νμ μ ννλ κ²μ΄ μ€μν©λλ€.
1. κΆν λΆμ¬ μ½λ μΉμΈ
κΆν λΆμ¬ μ½λ μΉμΈμ μΉ μ ν리μΌμ΄μ μ κ°μ₯ μΌλ°μ μΌλ‘ μ¬μ©λκ³ κΆμ₯λλ μΉμΈ μ νμ λλ€. μ΄ νλ‘μΈμ€λ ν΄λΌμ΄μΈνΈ μν¬λ¦Ώμ΄ 리μμ€ μμ μμ λΈλΌμ°μ μ λ ΈμΆλμ§ μλλ‘ νλ λ€λ¨κ³ νλ‘μΈμ€λ₯Ό ν¬ν¨ν©λλ€. ν΄λΌμ΄μΈνΈ μν¬λ¦Ώμ κΈ°λ°μ±μ μ μ§ν μ μλ ν΄λΌμ΄μΈνΈ(κΈ°λ° ν΄λΌμ΄μΈνΈ)μ ν¨κ» μ¬μ©νλλ‘ μ€κ³λμμ΅λλ€. λ€μμ κ°λ΅νλ μ€λͺ μ λλ€:
- ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ΄ λ¦¬μμ€ μμ μλ₯Ό κΆν λΆμ¬ μλ²λ‘ 리λλ μ ν©λλ€.
- 리μμ€ μμ μκ° κΆν λΆμ¬ μλ²λ‘ μΈμ¦νκ³ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ λν κΆνμ λΆμ¬ν©λλ€.
- κΆν λΆμ¬ μλ²κ° κΆν λΆμ¬ μ½λλ₯Ό ν¬ν¨νμ¬ λ¦¬μμ€ μμ μλ₯Ό ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μΌλ‘ λ€μ 리λλ μ ν©λλ€.
- ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ΄ κΆν λΆμ¬ μ½λλ₯Ό μ‘μΈμ€ ν ν° λ° μλ‘κ³ μΉ¨ ν ν°κ³Ό κ΅νν©λλ€.
- ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ΄ μ‘μΈμ€ ν ν°μ μ¬μ©νμ¬ λ¦¬μμ€ μλ²μμ 보νΈλ 리μμ€μ μ‘μΈμ€ν©λλ€.
μ: μ¬μ©μκ° νμ¬ λ¬Έμ νΈμ§ μ ν리μΌμ΄μ μ Google Drive κ³μ μ μ°κ²°νλ €κ³ ν©λλ€. μ ν리μΌμ΄μ μ μ¬μ©μλ₯Ό Google μΈμ¦ νμ΄μ§λ‘ 리λλ μ νλ©°, μ¬κΈ°μ μ¬μ©μλ λ‘κ·ΈμΈνκ³ μ ν리μΌμ΄μ μ΄ Google Drive νμΌμ μ‘μΈμ€νλλ‘ νμ©ν©λλ€. κ·Έλ° λ€μ Googleμ κΆν λΆμ¬ μ½λλ₯Ό μ ν리μΌμ΄μ μ λ°ννλ©°, μ ν리μΌμ΄μ μ μ΄ μ½λλ₯Ό μ‘μΈμ€ ν ν° λ° μλ‘κ³ μΉ¨ ν ν°κ³Ό κ΅νν©λλ€.
2. μμμ μΉμΈ
μμμ μΉμΈμ λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ (SPA) λλ λΈλΌμ°μ μμ μ€νλλ λ€μ΄ν°λΈ λͺ¨λ°μΌ μ ν리μΌμ΄μ κ³Ό κ°μ΄ ν΄λΌμ΄μΈνΈ μν¬λ¦Ώμ μμ νκ² μ μ₯ν μ μλ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ μν΄ μ€κ³λ κΆν λΆμ¬ μ½λ μΉμΈμ κ°μνλ λ²μ μ λλ€. μ΄ μΉμΈ μ νμμλ 리μμ€ μμ μκ° κΆν λΆμ¬ μλ²λ‘ μΈμ¦ν ν μ‘μΈμ€ ν ν°μ΄ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ μ§μ λ°νλ©λλ€. κ·Έλ¬λ μ‘μΈμ€ ν ν°μ΄ κ°λ‘μ±μΌ μν λλ¬Έμ κΆν λΆμ¬ μ½λ μΉμΈλ³΄λ€ λ μμ ν κ²μΌλ‘ κ°μ£Όλ©λλ€.
μ€μ μ°Έκ³ : μμμ μΉμΈμ μ΄μ λλΆλΆ μ¬μ©λμ§ μλ κ²μΌλ‘ κ°μ£Όλ©λλ€. 보μ λͺ¨λ² μ¬λ‘μμλ SPA λ° λ€μ΄ν°λΈ μ±μ κ²½μ°μλ PKCE(Proof Key for Code Exchange)λ₯Ό μ¬μ©ν κΆν λΆμ¬ μ½λ μΉμΈμ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
3. 리μμ€ μμ μ λΉλ°λ²νΈ μ격 μ¦λͺ μΉμΈ
리μμ€ μμ μ λΉλ°λ²νΈ μ격 μ¦λͺ μΉμΈμ ν΅ν΄ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ 리μμ€ μμ μμ μ¬μ©μ μ΄λ¦κ³Ό λΉλ°λ²νΈλ₯Ό κΆν λΆμ¬ μλ²μ μ§μ μ 곡νμ¬ μ‘μΈμ€ ν ν°μ μ»μ μ μμ΅λλ€. μ΄ μΉμΈ μ νμ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ΄ λ§€μ° μ λ’°ν μ μκ³ λ¦¬μμ€ μμ μμ μ§μ μ μΈ κ΄κ³κ° μλ κ²½μ°μλ§ μ¬μ©ν΄μΌ ν©λλ€. μΌλ°μ μΌλ‘ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ μ격 μ¦λͺ μ μ§μ 곡μ νλ κ²κ³Ό κ΄λ ¨λ 보μ μν λλ¬Έμ κΆμ₯λμ§ μμ΅λλ€.
μ: μνμμ κ°λ°ν 첫 λ²μ§Έ νν° λͺ¨λ°μΌ μ ν리μΌμ΄μ μ μ΄ μΉμΈ μ νμ μ¬μ©νμ¬ μ¬μ©μκ° κ³μ μ μ‘μΈμ€νλλ‘ ν μ μμ΅λλ€. κ·Έλ¬λ νμ¬ μ ν리μΌμ΄μ μ μΌλ°μ μΌλ‘ μ΄ μΉμΈ μ νμ νΌν΄μΌ ν©λλ€.
4. ν΄λΌμ΄μΈνΈ μ격 μ¦λͺ μΉμΈ
ν΄λΌμ΄μΈνΈ μ격 μ¦λͺ μΉμΈμ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ΄ λ¦¬μμ€ μμ μλ₯Ό λμ νμ¬ μλνλ λμ μ체 μ격 μ¦λͺ (ν΄λΌμ΄μΈνΈ ID λ° ν΄λΌμ΄μΈνΈ μν¬λ¦Ώ)μ μ¬μ©νμ¬ μ‘μΈμ€ ν ν°μ μ»μ μ μλλ‘ ν©λλ€. μ΄ μΉμΈ μ νμ μΌλ°μ μΌλ‘ μλ² κ° ν΅μ μ μ¬μ©λκ±°λ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ΄ μ§μ μμ ν 리μμ€μ μ‘μΈμ€ν΄μΌ νλ κ²½μ°μ μ¬μ©λ©λλ€.
μ: ν΄λΌμ°λ μ 곡μ 체μ μλ² λ©νΈλ¦μ μ‘μΈμ€ν΄μΌ νλ λͺ¨λν°λ§ μ ν리μΌμ΄μ μ μ΄ μΉμΈ μ νμ μ¬μ©ν μ μμ΅λλ€.
5. μλ‘κ³ μΉ¨ ν ν° μΉμΈ
μλ‘κ³ μΉ¨ ν ν° μΉμΈμ ν΅ν΄ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ μλ‘κ³ μΉ¨ ν ν°μ μ¬μ©νμ¬ μ μ‘μΈμ€ ν ν°μ μ»μ μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ 리μμ€ μμ μκ° μ ν리μΌμ΄μ μ λ€μ μΉμΈν νμ μμ΄ λ³΄νΈλ 리μμ€μ λν μ‘μΈμ€λ₯Ό μ μ§ν μ μμ΅λλ€. μλ‘κ³ μΉ¨ ν ν°μ μ μ‘μΈμ€ ν ν° λ° μ νμ μΌλ‘ μ μλ‘κ³ μΉ¨ ν ν°κ³Ό κ΅νλ©λλ€. μ΄μ μ‘μΈμ€ ν ν°μ 무ν¨νλ©λλ€.
OAuth2 ꡬν: λ¨κ³λ³ κ°μ΄λ
OAuth2 ꡬνμλ λͺ κ°μ§ μ£Όμ λ¨κ³κ° ν¬ν¨λ©λλ€:
1. ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ λ±λ‘
첫 λ²μ§Έ λ¨κ³λ κΆν λΆμ¬ μλ²μ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ λ±λ‘νλ κ²μ λλ€. μΌλ°μ μΌλ‘ μ ν리μΌμ΄μ μ΄λ¦, μ€λͺ , 리λλ μ URI(κΆν λΆμ¬ μλ²κ° μΈμ¦ ν 리μμ€ μμ μλ₯Ό 리λλ μ ν μμΉ) λ° μνλ μΉμΈ μ νκ³Ό κ°μ μ 보λ₯Ό μ 곡ν΄μΌ ν©λλ€. κ·Έλ° λ€μ κΆν λΆμ¬ μλ²λ μ ν리μΌμ΄μ μ μλ³νκ³ μΈμ¦νλ λ° μ¬μ©λ ν΄λΌμ΄μΈνΈ IDμ ν΄λΌμ΄μΈνΈ μν¬λ¦Ώμ λ°κΈν©λλ€.
μ: Googleμ OAuth2 μλΉμ€μ μ ν리μΌμ΄μ μ λ±λ‘ν λ κΆν λΆμ¬ μ½λλ₯Ό μμ νλ λ° μ ν리μΌμ΄μ μμ μ¬μ©ν URIμ μΌμΉν΄μΌ νλ 리λλ μ URIλ₯Ό μ 곡ν΄μΌ ν©λλ€. λν Google Drive λλ Gmail μ‘μΈμ€μ κ°μ΄ μ ν리μΌμ΄μ μμ νμν λ²μλ₯Ό μ§μ ν΄μΌ ν©λλ€.
2. κΆν λΆμ¬ νλ¦ μμ
λ€μ λ¨κ³λ κΆν λΆμ¬ νλ¦μ μμνλ κ²μ λλ€. μ¬κΈ°μλ 리μμ€ μμ μλ₯Ό κΆν λΆμ¬ μλ²μ κΆν λΆμ¬ μλν¬μΈνΈλ‘ 리λλ μ νλ κ²μ΄ ν¬ν¨λ©λλ€. κΆν λΆμ¬ μλν¬μΈνΈλ μΌλ°μ μΌλ‘ λ€μ λ§€κ°λ³μλ₯Ό νμλ‘ ν©λλ€:
client_id: κΆν λΆμ¬ μλ²μμ λ°κΈν ν΄λΌμ΄μΈνΈ IDμ λλ€.redirect_uri: κΆν λΆμ¬ μλ²κ° μΈμ¦ ν 리μμ€ μμ μλ₯Ό 리λλ μ ν URIμ λλ€.response_type: κΆν λΆμ¬ μλ²μμ μμνλ μλ΅ μ ν(μ: κΆν λΆμ¬ μ½λ μΉμΈμ κ²½μ°code)μ λλ€.scope: μνλ μ‘μΈμ€ λ²μμ λλ€.state: μ¬μ΄νΈ κ° μμ² μμ‘°(CSRF) 곡격μ λ°©μ§νλ λ° μ¬μ©λλ μ νμ λ§€κ°λ³μμ λλ€.
μ: 리λλ μ
URIλ λ€μκ³Ό κ°μ μ μμ΅λλ€: https://example.com/oauth2/callback. state λ§€κ°λ³μλ μ ν리μΌμ΄μ
μ΄ κΆν λΆμ¬ μλ²μ μλ΅μ΄ ν©λ²μ μΈμ§ νμΈνλ λ° μ¬μ©ν μ μλ 무μμλ‘ μμ±λ λ¬Έμμ΄μ
λλ€.
3. κΆν λΆμ¬ μλ΅ μ²λ¦¬
리μμ€ μμ μκ° κΆν λΆμ¬ μλ²λ‘ μΈμ¦νκ³ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ κΆνμ λΆμ¬νλ©΄, κΆν λΆμ¬ μλ²λ 리μμ€ μμ μλ₯Ό ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ 리λλ μ URIλ‘ λ€μ 리λλ μ νλ©°, μ΄λ κΆν λΆμ¬ μ½λ(κΆν λΆμ¬ μ½λ μΉμΈμ κ²½μ°) λλ μ‘μΈμ€ ν ν°(μμμ μΉμΈμ κ²½μ°)μ΄ ν¬ν¨λ©λλ€. κ·Έλ° λ€μ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ μ΄ μλ΅μ μ μ νκ² μ²λ¦¬ν΄μΌ ν©λλ€.
μ: κΆν λΆμ¬ μλ²κ° κΆν λΆμ¬ μ½λλ₯Ό λ°ννλ κ²½μ°, ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ κΆν λΆμ¬ μλ²μ ν ν° μλν¬μΈνΈλ‘ POST μμ²μ λ³΄λ΄ μ‘μΈμ€ ν ν° λ° μλ‘κ³ μΉ¨ ν ν°κ³Ό κ΅νν΄μΌ ν©λλ€. ν ν° μλν¬μΈνΈλ μΌλ°μ μΌλ‘ λ€μ λ§€κ°λ³μλ₯Ό νμλ‘ ν©λλ€:
grant_type: μΉμΈ μ ν(μ:authorization_code)μ λλ€.code: κΆν λΆμ¬ μλ²μμ λ°μ κΆν λΆμ¬ μ½λμ λλ€.redirect_uri: κΆν λΆμ¬ μμ²μ μ¬μ©λ κ²κ³Ό λμΌν 리λλ μ URIμ λλ€.client_id: κΆν λΆμ¬ μλ²μμ λ°κΈν ν΄λΌμ΄μΈνΈ IDμ λλ€.client_secret: κΆν λΆμ¬ μλ²μμ λ°κΈν ν΄λΌμ΄μΈνΈ μν¬λ¦Ώ(κΈ°λ° ν΄λΌμ΄μΈνΈμ κ²½μ°)μ λλ€.
4. 보νΈλ 리μμ€ μ‘μΈμ€
ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ
μ΄ μ‘μΈμ€ ν ν°μ μ»μΌλ©΄ μ΄λ₯Ό μ¬μ©νμ¬ λ¦¬μμ€ μλ²μ 보νΈλ 리μμ€μ μ‘μΈμ€ν μ μμ΅λλ€. μ‘μΈμ€ ν ν°μ μΌλ°μ μΌλ‘ Bearer μ€ν΄μ μ¬μ©νμ¬ HTTP μμ²μ Authorization ν€λμ ν¬ν¨λ©λλ€.
μ: μμ λ―Έλμ΄ νλ«νΌμμ μ¬μ©μ νλ‘νμ μ‘μΈμ€νκΈ° μν΄ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ λ€μκ³Ό κ°μ μμ²μ ν μ μμ΅λλ€:
GET /api/v1/me HTTP/1.1
Host: api.example.com
Authorization: Bearer [access_token]
5. ν ν° μλ‘κ³ μΉ¨ μ²λ¦¬
μ‘μΈμ€ ν ν°μ μΌλ°μ μΌλ‘ μλͺ μ΄ μ νμ μ λλ€. μ‘μΈμ€ ν ν°μ΄ λ§λ£λλ©΄ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ μλ‘κ³ μΉ¨ ν ν°μ μ¬μ©νμ¬ λ¦¬μμ€ μμ μκ° μ ν리μΌμ΄μ μ λ€μ μΉμΈν νμ μμ΄ μ μ‘μΈμ€ ν ν°μ μ»μ μ μμ΅λλ€. μ‘μΈμ€ ν ν°μ μλ‘κ³ μΉ¨νλ €λ©΄ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ λ€μ λ§€κ°λ³μλ₯Ό ν¬ν¨νμ¬ κΆν λΆμ¬ μλ²μ ν ν° μλν¬μΈνΈλ‘ POST μμ²μ 보λ λλ€:
grant_type: μΉμΈ μ ν(μ:refresh_token)μ λλ€.refresh_token: κΆν λΆμ¬ μλ²μμ λ°μ μλ‘κ³ μΉ¨ ν ν°μ λλ€.client_id: κΆν λΆμ¬ μλ²μμ λ°κΈν ν΄λΌμ΄μΈνΈ IDμ λλ€.client_secret: κΆν λΆμ¬ μλ²μμ λ°κΈν ν΄λΌμ΄μΈνΈ μν¬λ¦Ώ(κΈ°λ° ν΄λΌμ΄μΈνΈμ κ²½μ°)μ λλ€.
보μ κ³ λ € μ¬ν
OAuth2λ κ°λ ₯ν κΆν λΆμ¬ νλ μμν¬μ΄μ§λ§ μ¬μ©μ λ°μ΄ν°λ₯Ό 보νΈνκ³ κ³΅κ²©μ λ°©μ§νκΈ° μν΄ μμ νκ² κ΅¬ννλ κ²μ΄ μ€μν©λλ€. λ€μμ λͺ κ°μ§ μ£Όμ 보μ κ³ λ € μ¬νμ λλ€:
- HTTPS μ¬μ©: ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ , κΆν λΆμ¬ μλ² λ° λ¦¬μμ€ μλ² κ°μ λͺ¨λ ν΅μ μ λμ²μ λ°©μ§νκΈ° μν΄ HTTPSλ₯Ό μ¬μ©νμ¬ μνΈνν΄μΌ ν©λλ€.
- 리λλ μ URI μ ν¨μ± κ²μ¬: κΆν λΆμ¬ μ½λ μ½μ 곡격μ λ°©μ§νκΈ° μν΄ λ¦¬λλ μ URIλ₯Ό μ μ€νκ² μ ν¨μ±μ κ²μ¬ν©λλ€. λ±λ‘λ 리λλ μ URIλ§ νμ©νκ³ μ¬λ°λ₯΄κ² νμνλμλμ§ νμΈν©λλ€.
- ν΄λΌμ΄μΈνΈ μν¬λ¦Ώ 보νΈ: ν΄λΌμ΄μΈνΈ μν¬λ¦Ώμ κΈ°λ°λ‘ μ μ§ν©λλ€. ν΄λΌμ΄μΈνΈ μΈ‘ μ½λμ μ μ₯νκ±°λ λ¬΄λ¨ λΉμ¬μμκ² λ ΈμΆνμ§ λ§μμμ€.
- μν λ§€κ°λ³μ ꡬν: CSRF 곡격μ λ°©μ§νκΈ° μν΄
stateλ§€κ°λ³μλ₯Ό μ¬μ©ν©λλ€. - μ‘μΈμ€ ν ν° μ ν¨μ± κ²μ¬: 리μμ€ μλ²λ 보νΈλ 리μμ€μ λν μ‘μΈμ€λ₯Ό νμ©νκΈ° μ μ μ‘μΈμ€ ν ν°μ μ ν¨μ±μ κ²μ¬ν΄μΌ ν©λλ€. μ¬κΈ°μλ μΌλ°μ μΌλ‘ ν ν°μ μλͺ λ° λ§λ£ μκ° νμΈμ΄ ν¬ν¨λ©λλ€.
- λ²μ ꡬν: ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ λΆμ¬λ κΆνμ μ ννκΈ° μν΄ λ²μλ₯Ό μ¬μ©ν©λλ€. μ΅μν νμν κΆνλ§ λΆμ¬ν©λλ€.
- ν ν° μ μ₯: ν ν°μ μμ νκ² μ μ₯ν©λλ€. λ€μ΄ν°λΈ μ ν리μΌμ΄μ μ κ²½μ° μ΄μ 체μ μ μμ ν μ μ₯ λ©μ»€λμ¦μ κ³ λ €νμμμ€. μΉ μ ν리μΌμ΄μ μ κ²½μ° μμ ν μΏ ν€ λλ μλ² μΈ‘ μΈμ μ μ¬μ©ν©λλ€.
- PKCE(Proof Key for Code Exchange) κ³ λ €: ν΄λΌμ΄μΈνΈ μν¬λ¦Ώμ μμ νκ² μ μ₯ν μ μλ μ ν리μΌμ΄μ (SPA λ° λ€μ΄ν°λΈ μ±κ³Ό κ°μ)μ κ²½μ° PKCEλ₯Ό μ¬μ©νμ¬ κΆν λΆμ¬ μ½λ κ°λ‘μ±κΈ° μνμ μνν©λλ€.
OpenID Connect (OIDC)
OpenID Connect(OIDC)λ OAuth2 μμ ꡬμΆλ μΈμ¦ κ³μΈ΅μ λλ€. μ΄λ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ΄ κΆν λΆμ¬ μλ²μμ μνν μΈμ¦μ κΈ°λ°μΌλ‘ 리μμ€ μμ μμ μ μμ νμΈνκ³ , μνΈ μ΄μ© κ°λ₯νκ³ RESTμ μ μ¬ν λ°©μμΌλ‘ 리μμ€ μμ μμ λν κΈ°λ³Έ νλ‘ν μ 보λ₯Ό μ»μ μ μλ νμ€νλ λ°©λ²μ μ 곡ν©λλ€.
OAuth2λ μ£Όλ‘ κΆν λΆμ¬ νλ μμν¬μΈ λ°λ©΄, OIDCλ μΈμ¦ κ΅¬μ± μμλ₯Ό μΆκ°νμ¬ λ¦¬μμ€μ λν μ‘μΈμ€λ₯Ό κΆν λΆμ¬νλ κ²λΏλ§ μλλΌ μ¬μ©μμ μ μμ νμΈν΄μΌ νλ μ¬μ© μ¬λ‘μ μ ν©ν©λλ€. OIDCλ μ¬μ©μμ μ μμ λν ν΄λ μμ ν¬ν¨νλ JSON Web Token(JWT)μΈ ID ν ν°μ κ°λ μ λμ ν©λλ€.
OIDCλ₯Ό ꡬνν λ κΆν λΆμ¬ μλ²μ μλ΅μλ μ‘μΈμ€ ν ν°(보νΈλ 리μμ€ μ‘μΈμ€μ©)κ³Ό ID ν ν°(μ¬μ©μ μ μ νμΈμ©)μ΄ λͺ¨λ ν¬ν¨λ©λλ€.
OAuth2 μ 곡μ 체 μ ν
μ체 OAuth2 κΆν λΆμ¬ μλ²λ₯Ό ꡬννκ±°λ νμ¬ μ 곡μ 체λ₯Ό μ¬μ©ν μ μμ΅λλ€. μ체 κΆν λΆμ¬ μλ²λ₯Ό ꡬννλ κ²μ 볡μ‘νκ³ μκ°μ΄ λ§μ΄ μμλ μ μμ§λ§ μΈμ¦ νλ‘μΈμ€μ λν μμ ν μ μ΄λ₯Ό μ 곡ν©λλ€. νμ¬ μ 곡μ 체λ₯Ό μ¬μ©νλ κ²μ μ’ μ’ λ κ°λ¨νκ³ λΉμ© ν¨μ¨μ μ΄μ§λ§ μΈμ¦μ μν΄ μ 3μμ μμ‘΄ν΄μΌ ν©λλ€.
μΈκΈ° μλ OAuth2 μ 곡μ 체λ λ€μκ³Ό κ°μ΅λλ€:
- Google Identity Platform
- Facebook Login
- Microsoft Azure Active Directory
- Auth0
- Okta
- Ping Identity
OAuth2 μ 곡μ 체λ₯Ό μ νν λ λ€μμ ν¬ν¨ν μμλ₯Ό κ³ λ €νμμμ€:
- κ°κ²©
- κΈ°λ₯
- 보μ
- μμ μ±
- ν΅ν© μ©μ΄μ±
- κ·μ μ€μ μꡬ μ¬ν(μ: GDPR, CCPA)
- κ°λ°μ μ§μ
λ€μν νκ²½μμμ OAuth2
OAuth2λ μΉ μ ν리μΌμ΄μ , λͺ¨λ°μΌ μ±λΆν° λ°μ€ν¬ν± μ ν리μΌμ΄μ λ° IoT μ₯μΉμ μ΄λ₯΄κΈ°κΉμ§ λ€μν νκ²½μμ μ¬μ©λ©λλ€. νΉμ ꡬν μΈλΆ μ¬νμ νκ²½μ λ°λΌ λ€λ₯Ό μ μμ§λ§ ν΅μ¬ κ°λ κ³Ό μμΉμ λμΌνκ² μ μ§λ©λλ€.
μΉ μ ν리μΌμ΄μ
μΉ μ ν리μΌμ΄μ μμλ OAuth2κ° μΌλ°μ μΌλ‘ μλ² μΈ‘ μ½λκ° ν ν° κ΅ν λ° μ μ₯μ μ²λ¦¬νλ κΆν λΆμ¬ μ½λ μΉμΈμ μ¬μ©νμ¬ κ΅¬νλ©λλ€. λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ (SPA)μ κ²½μ° PKCEλ₯Ό μ¬μ©ν κΆν λΆμ¬ μ½λ μΉμΈμ΄ κΆμ₯λλ μ κ·Ό λ°©μμ λλ€.
λͺ¨λ°μΌ μ ν리μΌμ΄μ
λͺ¨λ°μΌ μ ν리μΌμ΄μ μμλ OAuth2κ° μΌλ°μ μΌλ‘ PKCEλ₯Ό μ¬μ©ν κΆν λΆμ¬ μ½λ μΉμΈ λλ OAuth2 μ 곡μ 체μμ μ 곡νλ λ€μ΄ν°λΈ SDKλ₯Ό μ¬μ©νμ¬ κ΅¬νλ©λλ€. μ΄μ 체μ μ μμ ν μ μ₯ λ©μ»€λμ¦μ μ¬μ©νμ¬ μ‘μΈμ€ ν ν°μ μμ νκ² μ μ₯νλ κ²μ΄ μ€μν©λλ€.
λ°μ€ν¬ν± μ ν리μΌμ΄μ
λ°μ€ν¬ν± μ ν리μΌμ΄μ μμ OAuth2λ ν¬ν¨λ λΈλΌμ°μ λλ μμ€ν λΈλΌμ°μ λ₯Ό μ¬μ©ν κΆν λΆμ¬ μ½λ μΉμΈμ μ¬μ©νμ¬ κ΅¬νν μ μμ΅λλ€. λͺ¨λ°μΌ μ ν리μΌμ΄μ κ³Ό λ§μ°¬κ°μ§λ‘ μ‘μΈμ€ ν ν°μ μμ νκ² μ μ₯νλ κ²μ΄ μ€μν©λλ€.
IoT μ₯μΉ
IoT μ₯μΉμμλ μ΄λ¬ν μ₯μΉμ μ νλ 리μμ€ λ° λ³΄μ μ μ½μΌλ‘ μΈν΄ OAuth2 ꡬνμ΄ λ μ΄λ €μΈ μ μμ΅λλ€. ν΄λΌμ΄μΈνΈ μ격 μ¦λͺ μΉμΈ λλ κΆν λΆμ¬ μ½λ μΉμΈμ κ°μνλ λ²μ μ νΉμ μꡬ μ¬νμ λ°λΌ μ¬μ©λ μ μμ΅λλ€.
μΌλ°μ μΈ OAuth2 λ¬Έμ ν΄κ²°
OAuth2 ꡬνμ λλλ‘ μ΄λ €μΈ μ μμ΅λλ€. λ€μμ λͺ κ°μ§ μΌλ°μ μΈ λ¬Έμ μ ν΄κ²° λ°©λ²μ λλ€:
- μλͺ»λ 리λλ μ URI: κΆν λΆμ¬ μλ²μ λ±λ‘λ 리λλ μ URIκ° κΆν λΆμ¬ μμ²μ μ¬μ©λ URIμ μΌμΉνλμ§ νμΈν©λλ€.
- μλͺ»λ ν΄λΌμ΄μΈνΈ ID λλ μν¬λ¦Ώ: ν΄λΌμ΄μΈνΈ IDμ ν΄λΌμ΄μΈνΈ μν¬λ¦Ώμ΄ μ¬λ°λ₯Έμ§ λ€μ νμΈν©λλ€.
- μΉμΈλμ§ μμ λ²μ: μμ²λ λ²μκ° κΆν λΆμ¬ μλ²μμ μ§μλλμ§, κ·Έλ¦¬κ³ ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ΄ ν΄λΉ λ²μμ μ‘μΈμ€ν μ μλ κΆνμ λΆμ¬λ°μλμ§ νμΈν©λλ€.
- μ‘μΈμ€ ν ν° λ§λ£: μλ‘κ³ μΉ¨ ν ν°μ μ¬μ©νμ¬ μ μ‘μΈμ€ ν ν°μ μ»μ΅λλ€.
- ν ν° μ ν¨μ± κ²μ¬ μ€ν¨: 리μμ€ μλ²κ° μ‘μΈμ€ ν ν°μ μ ν¨μ±μ κ²μ¬νλλ‘ μ¬λ°λ₯΄κ² ꡬμ±λμλμ§ νμΈν©λλ€.
- CORS μ€λ₯: 리μμ€ κ³΅μ κ°(CORS) μ€λ₯κ° λ°μνλ κ²½μ°, κΆν λΆμ¬ μλ² λ° λ¦¬μμ€ μλ²κ° ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μ λλ©μΈμμ μμ²μ νμ©νλλ‘ μ¬λ°λ₯΄κ² ꡬμ±λμλμ§ νμΈν©λλ€.
κ²°λ‘
OAuth2λ λ€μν μ ν리μΌμ΄μ μ λν μμ νκ³ μνν μ¬μ©μ μΈμ¦μ κ°λ₯νκ² νλ κ°λ ₯νκ³ λ€μ¬λ€λ₯ν κΆν λΆμ¬ νλ μμν¬μ λλ€. ν΅μ¬ κ°λ , μΉμΈ μ ν λ° λ³΄μ κ³ λ € μ¬νμ μ΄ν΄ν¨μΌλ‘μ¨ κ°λ°μλ OAuth2λ₯Ό ν¨κ³Όμ μΌλ‘ ꡬννμ¬ μ¬μ©μ λ°μ΄ν°λ₯Ό 보νΈνκ³ νλ₯ν μ¬μ©μ κ²½νμ μ 곡ν μ μμ΅λλ€.
μ΄ κ°μ΄λμμλ OAuth2 ꡬνμ λν ν¬κ΄μ μΈ κ°μλ₯Ό μ 곡νμ΅λλ€. λ μμΈν μ 보μ μ§μΉ¨μ 곡μ OAuth2 μ¬μκ³Ό μ νν OAuth2 μ 곡μ 체μ μ€λͺ μλ₯Ό μ°Έμ‘°νμμμ€. νμ 보μ λͺ¨λ² μ¬λ‘λ₯Ό μ°μ μνκ³ μ΅μ κΆμ₯ μ¬νμ μμ§νμ¬ μ¬μ©μ λ°μ΄ν°μ 무결μ±κ³Ό κΈ°λ°μ±μ 보μ₯νμμμ€.