<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"})으둜 토큰을 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ°˜ν™˜ν•©λ‹ˆλ‹€.


🎯 챕터 λͺ©ν‘œ

이 κ°•μ˜λ₯Ό 마치면 μ—¬λŸ¬λΆ„μ€ λ‹€μŒμ„ ν•  수 있게 λ©λ‹ˆλ‹€:

  1. OAuth2 μ•”ν˜Έ(Password) 그랜트 νƒ€μž… 흐름에 따라 둜그인 μ—”λ“œν¬μΈνŠΈλ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. python-jose 라이브러리λ₯Ό μ„€μΉ˜ν•˜κ³  JWT κ΄€λ ¨ μ„€μ •(SECRET_KEY, μ•Œκ³ λ¦¬μ¦˜, 만료 μ‹œκ°„)을 ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€. (app/security.py)
  3. JWT μ•‘μ„ΈμŠ€ 토큰을 μƒμ„±ν•˜λŠ” ν•¨μˆ˜(create_access_token)λ₯Ό κ΅¬ν˜„ν•˜κ³ , νŽ˜μ΄λ‘œλ“œμ— sub 및 exp ν΄λ ˆμž„μ„ ν¬ν•¨μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  4. FastAPI의 OAuth2PasswordRequestForm μ˜μ‘΄μ„±μ„ μ‚¬μš©ν•˜μ—¬ 둜그인 **자격 증λͺ…(이메일, λΉ„λ°€λ²ˆν˜Έ)**을 받을 수 μžˆμŠ΅λ‹ˆλ‹€.
  5. 둜그인 μ—”λ“œν¬μΈνŠΈμ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ‚¬μš©μž 정보와 verify_password ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 자격 증λͺ…을 검증할 수 μžˆμŠ΅λ‹ˆλ‹€.
  6. 둜그인 성곡 μ‹œ μƒμ„±λœ JWTλ₯Ό OAuth2 ν‘œμ€€ ν˜•μ‹({"access_token": ..., "token_type": "bearer"})으둜 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.