<aside>
</aside>
μλ νμΈμ! 보μ κΈ°λ₯ ꡬνμ λ λ²μ§Έ μκ°, 29κ°μ λλ€! π
μ΄μ μ¬μ©μκ° λ±λ‘νμΌλ, λλμ΄ λ‘κ·ΈμΈν μ°¨λ‘μ λλ€! μ΄λ² μκ°μλ μ¬μ©μκ° μ΄λ©μΌκ³Ό λΉλ°λ²νΈλ₯Ό μ 곡νλ©΄, μ΄λ₯Ό κ²μ¦νκ³ μ±κ³΅ μ JWT(JSON Web Token) μ‘μΈμ€ ν ν°μ λ°κΈνλ λ‘κ·ΈμΈ API μλν¬μΈνΈλ₯Ό ꡬνν©λλ€. 27κ°μμ κ³ννλ λλ‘ OAuth2μ μνΈ(Password) κ·ΈλνΈ νμ νλ¦μ λ°λ₯Ό κ²μ λλ€.
JWT ν ν°μ μμ±νκ³ κ΄λ¦¬νκΈ° μν΄ python-jose
λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νκ³ , ν ν°μ νμν μ 보(μ¬μ©μ μλ³μ, λ§λ£ μκ° λ±)λ₯Ό λ΄μ λΉλ° ν€λ‘ μμ νκ² μλͺ
νλ λ°©λ²μ λ°°μλλ€. λν, FastAPIμ OAuth2PasswordRequestForm
μ μ¬μ©νμ¬ λ‘κ·ΈμΈ μμ² λ°μ΄ν°λ₯Ό νΈλ¦¬νκ² λ°λ λ°©λ²λ μμλ΄
λλ€.
μ, μ¬μ©μμκ² API μ κ·Ό κΆνμ λΆμ¬νλ λ§λ²μ μ΄μ , JWTλ₯Ό λ°κΈν΄ λ΄ μλ€! π«β¨
μ΄λ² 29κ°μμλ 28κ°μμ ꡬνν μ¬μ©μ λ±λ‘ κΈ°λ₯μ μ΄μ΄, λ±λ‘λ μ¬μ©μκ° λ‘κ·ΈμΈνμ¬ JWT μ‘μΈμ€ ν ν°μ λ°κΈλ°μ μ μλ API μλν¬μΈνΈλ₯Ό ꡬνν©λλ€. μ°λ¦¬λ OAuth2 μνΈ(Password) κ·ΈλνΈ νμ
νλ¦μ λ°λ₯Ό κ²μ
λλ€. μ¦, ν΄λΌμ΄μΈνΈ(μ°λ¦¬κ° μ λ’°νλ νλ‘ νΈμλ λ±)κ° μ¬μ©μλ‘λΆν° μ§μ μ΄λ©μΌ(μμ΄λ)κ³Ό λΉλ°λ²νΈλ₯Ό λ°μ μλ²μ νΉμ μλν¬μΈνΈ(μ: /token
)λ‘ μ μ‘νλ©΄, μλ²λ μ΄λ₯Ό κ²μ¦νκ³ μ±κ³΅ μ ν ν°μ λ°κΈνλ λ°©μμ
λλ€.
λ‘κ·ΈμΈ μλν¬μΈνΈ ꡬνμ μν΄, λ¨Όμ JWT μμ± λ° κ΄λ¦¬μ νμν μ€μ μ app/security.py
μ μΆκ°ν©λλ€. μ¬κΈ°μλ JWT μλͺ
μ μ¬μ©ν λΉλ° ν€(SECRET_KEY), μλͺ
μκ³ λ¦¬μ¦(ALGORITHM), ν ν° μ ν¨ κΈ°κ°(ACCESS_TOKEN_EXPIRE_MINUTES) λ±μ΄ ν¬ν¨λ©λλ€. κ·Έλ¦¬κ³ python-jose
λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ JWTλ₯Ό μμ±νλ create_access_token
ν¨μλ₯Ό ꡬνν©λλ€. ν ν°μ νμ΄λ‘λ(Payload)μλ μ¬μ©μ μλ³ μ 보(sub
)μ λ§λ£ μκ°(exp
) ν΄λ μ(Claim)μ ν¬ν¨μν΅λλ€.
λ€μμΌλ‘, λ‘κ·ΈμΈ μμ² μ²λ¦¬ μ ν΄λΌμ΄μΈνΈκ° application/x-www-form-urlencoded
νμμΌλ‘ 보λ΄λ username
(μ΄λ©μΌλ‘ μ¬μ©)κ³Ό password
λ₯Ό μ½κ² λ°κΈ° μν΄ FastAPIμ OAuth2PasswordRequestForm
μμ‘΄μ±μ μ¬μ©ν©λλ€.
λ§μ§λ§μΌλ‘, μ΄ λͺ¨λ κ²μ μ’
ν©νμ¬ /token
(λλ /login
) κ²½λ‘μ λν POST μλν¬μΈνΈλ₯Ό ꡬνν©λλ€. μ΄ μλν¬μΈνΈλ μ¬μ©μ μ‘°ν, verify_password
ν¨μλ₯Ό μ΄μ©ν λΉλ°λ²νΈ κ²μ¦, μ±κ³΅ μ create_access_token
ν¨μλ₯Ό μ΄μ©ν JWT μμ±μ μννκ³ , μ΅μ’
μ μΌλ‘ OAuth2 νμ€ νμ({"access_token": "...", "token_type": "bearer"}
)μΌλ‘ ν ν°μ ν΄λΌμ΄μΈνΈμκ² λ°νν©λλ€.
μ΄ κ°μλ₯Ό λ§μΉλ©΄ μ¬λ¬λΆμ λ€μμ ν μ μκ² λ©λλ€:
python-jose
λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€μΉνκ³ JWT κ΄λ ¨ μ€μ (SECRET_KEY, μκ³ λ¦¬μ¦, λ§λ£ μκ°)μ ꡬμ±ν μ μμ΅λλ€. (app/security.py
)create_access_token
)λ₯Ό ꡬννκ³ , νμ΄λ‘λμ sub
λ° exp
ν΄λ μμ ν¬ν¨μν¬ μ μμ΅λλ€.OAuth2PasswordRequestForm
μμ‘΄μ±μ μ¬μ©νμ¬ λ‘κ·ΈμΈ **μ격 μ¦λͺ
(μ΄λ©μΌ, λΉλ°λ²νΈ)**μ λ°μ μ μμ΅λλ€.verify_password
ν¨μλ₯Ό μ¬μ©νμ¬ μ격 μ¦λͺ
μ κ²μ¦ν μ μμ΅λλ€.{"access_token": ..., "token_type": "bearer"}
)μΌλ‘ ν΄λΌμ΄μΈνΈμκ² λ°νν μ μμ΅λλ€.