<aside>

</aside>

μ•ˆλ…•ν•˜μ„Έμš”! 인증 및 λ³΄μ•ˆ 6λΆ€μ˜ μ„Έ 번째 μ‹œκ°„, 30κ°•μž…λ‹ˆλ‹€! πŸ›‘οΈ

μ§€λ‚œ 29κ°•μ—μ„œλŠ” μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈν•˜κ³  JWT μ•‘μ„ΈμŠ€ 토큰을 λ°œκΈ‰λ°›λŠ” /token μ—”λ“œν¬μΈνŠΈλ₯Ό μ„±κ³΅μ μœΌλ‘œ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€. 이제 μ‚¬μš©μžλ“€μ€ 우리 API에 μ ‘κ·Όν•  수 μžˆλŠ” 'μ—΄μ‡ (JWT)'λ₯Ό 얻을 수 있게 λ˜μ—ˆμ–΄μš”! πŸ”‘

ν•˜μ§€λ§Œ 아직 우리 API의 λ‹€λ₯Έ λ¬Έλ“€(예: /tasks μ—”λ“œν¬μΈνŠΈλ“€)은 μž κ²¨μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ—΄μ‡ κ°€ μžˆλ“  μ—†λ“  λˆ„κ΅¬λ‚˜ λ“€μ–΄μ˜¬ 수 μžˆλŠ” μƒνƒœμ£ . 이번 μ‹œκ°„μ—λŠ” λ“œλ””μ–΄ 이 문듀을 μž κ·ΈλŠ” 방법을 λ°°μ›λ‹ˆλ‹€! ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ μ‹œ ν•¨κ»˜ 보낸 JWT 토큰을 κ²€μ¦ν•˜κ³ , μœ νš¨ν•œ 토큰을 κ°€μ§„ μ‚¬μš©μžλ§Œμ΄ 보호된 API κ²½λ‘œμ— μ ‘κ·Όν•  수 μžˆλ„λ‘ 인증 μš”κ΅¬μ‚¬ν•­μ„ μ μš©ν•˜λŠ” 방법을 κ΅¬ν˜„ν•  κ²ƒμž…λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄, 토큰을 κ²€μ¦ν•˜κ³  ν˜„μž¬ λ‘œκ·ΈμΈν•œ μ‚¬μš©μž 정보λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ°€μ Έμ˜€λŠ” **μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ˜μ‘΄μ„± ν•¨μˆ˜(get_current_user)**λ₯Ό λ§Œλ“€κ³ , 이 μ˜μ‘΄μ„±μ„ μš°λ¦¬κ°€ λ³΄ν˜Έν•˜κ³ μž ν•˜λŠ” /tasks κ΄€λ ¨ μ—”λ“œν¬μΈνŠΈλ“€μ— μ£Όμž…(Depends)ν•˜λŠ” 방법을 μ‹€μŠ΅ν•©λ‹ˆλ‹€. 이제 μ§„μ§œ μ‚¬μš©μž 인증이 λ™μž‘ν•˜λŠ” APIλ₯Ό λ§Œλ“€μ–΄ λ΄…μ‹œλ‹€!


πŸ“š 챕터 μ†Œκ°œ

이번 30κ°•μ—μ„œλŠ” 29κ°•μ—μ„œ λ°œκΈ‰λ°›μ€ JWT μ•‘μ„ΈμŠ€ 토큰을 μ‹€μ œλ‘œ μ‚¬μš©ν•˜μ—¬ API μ—”λ“œν¬μΈνŠΈλ₯Ό λ³΄ν˜Έν•˜λŠ” 방법을 κ΅¬ν˜„ν•©λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ 보호된 λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄ μš”μ²­ 헀더에 Authorization: Bearer <token> ν˜•νƒœλ‘œ JWTλ₯Ό 보내면, μ„œλ²„λŠ” 이 토큰을 λ°›μ•„ μœ νš¨μ„±μ„ 검증해야 ν•©λ‹ˆλ‹€.

λ¨Όμ €, JWT 토큰 검증 κ³Όμ •(μ„œλͺ… 확인, 만료 μ‹œκ°„ 확인, νŽ˜μ΄λ‘œλ“œ ν΄λ ˆμž„ μΆ”μΆœ)을 μ΄ν•΄ν•˜κ³ , python-jose 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ 토큰을 λ””μ½”λ”©ν•˜κ³  κ²€μ¦ν•˜λŠ” λ‘œμ§μ„ app/security.py νŒŒμΌμ— κ΅¬ν˜„ν•©λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ λ°œμƒν•  수 μžˆλŠ” λ‹€μ–‘ν•œ 였λ₯˜(예: 잘λͺ»λœ μ„œλͺ…, 만료된 토큰, ν•„μš”ν•œ ν΄λ ˆμž„ λˆ„λ½)λ₯Ό μ²˜λ¦¬ν•˜κ³  μ μ ˆν•œ HTTPException(주둜 401 Unauthorized)을 λ°œμƒμ‹œν‚€λŠ” 방법도 μ•Œμ•„λ΄…λ‹ˆλ‹€.

λ‹€μŒμœΌλ‘œ, 이 토큰 검증 둜직과 λ°μ΄ν„°λ² μ΄μŠ€ 쑰회λ₯Ό κ²°ν•©ν•˜μ—¬, μœ νš¨ν•œ ν† ν°μœΌλ‘œλΆ€ν„° μ‚¬μš©μž μ‹λ³„μž(예: 이메일)λ₯Ό μΆ”μΆœν•˜κ³  ν•΄λ‹Ή μ‚¬μš©μžμ˜ λ°μ΄ν„°λ² μ΄μŠ€ 정보(SQLAlchemy User 객체)λ₯Ό λ°˜ν™˜ν•˜λŠ” get_current_user μ˜μ‘΄μ„± ν•¨μˆ˜λ₯Ό λ§Œλ“­λ‹ˆλ‹€. FastAPI의 OAuth2PasswordBearer μŠ€ν‚€λ§ˆ(oauth2_scheme)λ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ²­ ν—€λ”μ—μ„œ 토큰을 μžλ™μœΌλ‘œ μΆ”μΆœν•˜λŠ” 방법을 ν™œμš©ν•©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ, μš°λ¦¬κ°€ λ³΄ν˜Έν•˜κ³ μž ν•˜λŠ” λͺ¨λ“  Task κ΄€λ ¨ API μ—”λ“œν¬μΈνŠΈ(app/routers/tasks.py λ‚΄λΆ€ ν•¨μˆ˜λ“€)의 νŒŒλΌλ―Έν„°μ— Depends(get_current_user)λ₯Ό μΆ”κ°€ν•˜μ—¬ 인증 μš”κ΅¬μ‚¬ν•­μ„ μ μš©ν•©λ‹ˆλ‹€. 이제 μœ νš¨ν•œ JWT 토큰 μ—†μ΄λŠ” ν•΄λ‹Ή μ—”λ“œν¬μΈνŠΈλ“€μ— μ ‘κ·Όν•  수 μ—†κ²Œ λ©λ‹ˆλ‹€!


🎯 챕터 λͺ©ν‘œ

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

  1. ν΄λΌμ΄μ–ΈνŠΈκ°€ JWTλ₯Ό Authorization: Bearer <token> ν—€λ”λ‘œ λ³΄λ‚΄λŠ” ν‘œμ€€ 방식을 μ΄ν•΄ν•©λ‹ˆλ‹€.
  2. python-joseλ₯Ό μ‚¬μš©ν•˜μ—¬ JWT의 μ„œλͺ…, 만료 μ‹œκ°„, ν΄λ ˆμž„μ„ κ²€μ¦ν•˜λŠ” λ‘œμ§μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (app/security.py)
  3. JWT 검증 κ³Όμ •μ—μ„œ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜(예: JWTError, 만료)λ₯Ό μ²˜λ¦¬ν•˜κ³  HTTPException을 λ°œμƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  4. OAuth2PasswordBearer와 DB 쑰회λ₯Ό κ²°ν•©ν•˜μ—¬, 토큰 검증 ν›„ ν˜„μž¬ 둜그인된 μ‚¬μš©μž 객체(SQLAlchemy λͺ¨λΈ)λ₯Ό λ°˜ν™˜ν•˜λŠ” get_current_user μ˜μ‘΄μ„± ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  5. Depends(get_current_user)λ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • 경둜 μž‘λ™ ν•¨μˆ˜(μ—”λ“œν¬μΈνŠΈ)λ₯Ό λ³΄ν˜Έν•˜κ³ , 인증된 μ‚¬μš©μž 정보에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.