<aside>

</aside>

μ•ˆλ…•ν•˜μ„Έμš”! λ“œλ””μ–΄ 6λΆ€ '인증 및 λ³΄μ•ˆ'의 λ§ˆμ§€λ§‰ μ‹œκ°„, 31κ°•μž…λ‹ˆλ‹€! πŸ₯³πŸ”

μ§€λ‚œ 30κ°•μ—μ„œλŠ” JWT 토큰을 κ²€μ¦ν•˜κ³  get_current_user μ˜μ‘΄μ„±μ„ λ§Œλ“€μ–΄, 우리 /tasks API μ—”λ“œν¬μΈνŠΈλ“€μ„ 인증된 μ‚¬μš©μžλ§Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ λ³΄ν˜Έν–ˆμŠ΅λ‹ˆλ‹€. 이제 우리 APIλŠ” μš”μ²­μ„ 보낸 μ‚¬μš©μžκ°€ λˆ„κ΅¬μΈμ§€(인증) ν™•μ‹€νžˆ μ•Œ 수 있게 λ˜μ—ˆμ–΄μš”!

ν•˜μ§€λ§Œ μ‚¬μš©μžκ°€ λˆ„κ΅¬μΈμ§€ μ•„λŠ” κ²ƒλ§ŒμœΌλ‘œλŠ” μΆ©λΆ„ν•˜μ§€ μ•Šμ„ λ•Œκ°€ λ§ŽμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 'A' μ‚¬μš©μžκ°€ 'B' μ‚¬μš©μžκ°€ μž‘μ„±ν•œ ν•  일을 λ§ˆμŒλŒ€λ‘œ μˆ˜μ •ν•˜κ±°λ‚˜ μ‚­μ œν•  수 μžˆλ‹€λ©΄ λ¬Έμ œκ°€ 되겠죠? λ˜λŠ” 'κ΄€λ¦¬μž'만 μ ‘κ·Όν•΄μ•Ό ν•˜λŠ” νŠΉλ³„ν•œ κΈ°λŠ₯이 μžˆμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ 인증된 μ‚¬μš©μžκ°€ **무엇을 ν•  수 μžˆλŠ”μ§€(κΆŒν•œ)**λ₯Ό μ œμ–΄ν•˜λŠ” 것을 **인가(Authorization)**라고 ν•©λ‹ˆλ‹€.

이번 μ‹œκ°„μ—λŠ” λ°”λ‘œ 이 **인가(Authorization)**의 기초λ₯Ό κ΅¬ν˜„ν•΄ λ΄…λ‹ˆλ‹€. κ°€μž₯ ν”ν•œ 두 κ°€μ§€ νŒ¨ν„΄μΈ μ†Œμœ κΆŒ(Ownership) 기반 μ ‘κ·Ό μ œμ–΄ (λ‚΄ ν•  일은 λ‚˜λ§Œ!)와 μ—­ν•  기반 μ ‘κ·Ό μ œμ–΄(RBAC) 의 μ•„μ£Ό κ°„λ‹¨ν•œ ν˜•νƒœ (κ΄€λ¦¬μž ꡬ뢄)λ₯Ό 우리 ToDo API에 μ μš©ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. API의 λ³΄μ•ˆμ„ λ”μš± κ°•ν™”ν•˜κ³  μ‚¬μš©μžμ˜ 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ μ§€ν‚€λŠ” 방법을 λ°°μ›Œλ΄…μ‹œλ‹€! 🧐


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

이번 31κ°•μ—μ„œλŠ” 30κ°•μ—μ„œ κ΅¬ν˜„ν•œ μ‚¬μš©μž 인증(Authentication)을 λ°”νƒ•μœΌλ‘œ, 인가(Authorization), 즉 μ ‘κ·Ό μ œμ–΄ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” 기본적인 방법을 λ°°μ›λ‹ˆλ‹€. 인증이 'λˆ„κ΅¬μΈκ°€?'λ₯Ό ν™•μΈν•˜λŠ” 것이라면, μΈκ°€λŠ” '무엇을 ν•  수 μžˆλŠ”κ°€?'λ₯Ό κ²°μ •ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.

λ¨Όμ €, κ°€μž₯ 일반적인 인가 νŒ¨ν„΄ 쀑 ν•˜λ‚˜μΈ μ†Œμœ κΆŒ(Ownership) 기반 μ ‘κ·Ό μ œμ–΄λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ μžμ‹ μ˜ ν•  일(Task) λ°μ΄ν„°λ§Œ 쑰회, μˆ˜μ •, μ‚­μ œν•  수 μžˆλ„λ‘ tasks λΌμš°ν„°μ˜ κ΄€λ ¨ μ—”λ“œν¬μΈνŠΈ λ‘œμ§μ„ μˆ˜μ •ν•©λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€ 쿼리 μ‹œ ν˜„μž¬ 둜그인된 μ‚¬μš©μžμ˜ ID(current_user.id)와 Task의 μ†Œμœ μž ID(owner_id)λ₯Ό λΉ„κ΅ν•˜λŠ” 쑰건을 μΆ”κ°€ν•˜μ—¬ 이λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.

λ‹€μŒμœΌλ‘œ, **μ—­ν•  기반 μ ‘κ·Ό μ œμ–΄(Role-Based Access Control, RBAC)**의 μ•„μ£Ό 기초적인 ν˜•νƒœλ₯Ό κ΅¬ν˜„ν•΄ λ΄…λ‹ˆλ‹€. User SQLAlchemy λͺ¨λΈμ— is_admin κ³Ό 같은 λΆˆλ¦¬μ–Έ(boolean) ν•„λ“œλ₯Ό μΆ”κ°€ν•˜κ³ , 이 μŠ€ν‚€λ§ˆ λ³€κ²½ 사항을 Alembic λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜ν•©λ‹ˆλ‹€. 그리고 이 is_admin ν”Œλž˜κ·Έλ₯Ό ν™•μΈν•˜μ—¬ κ΄€λ¦¬μž κΆŒν•œμ„ μš”κ΅¬ν•˜λŠ” κ°„λ‹¨ν•œ **μ˜μ‘΄μ„± ν•¨μˆ˜(require_admin)**λ₯Ό λ§Œλ“€κ³ , 이λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΄€λ¦¬μž μ „μš© API μ—”λ“œν¬μΈνŠΈλ₯Ό λ³΄ν˜Έν•˜λŠ” 예제λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ, 인증 μ‹€νŒ¨ μ‹œ λ°˜ν™˜λ˜λŠ” 401 Unauthorized 와 인가 μ‹€νŒ¨ μ‹œ λ°˜ν™˜λ˜λŠ” 403 Forbidden μƒνƒœ μ½”λ“œμ˜ 의미 차이λ₯Ό λͺ…ν™•νžˆ μ •λ¦¬ν•©λ‹ˆλ‹€.


🎯 챕터 λͺ©ν‘œ

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

  1. **인가(Authorization)**의 κ°œλ…κ³Ό 인증(Authentication)과의 차이λ₯Ό λͺ…ν™•νžˆ μ„€λͺ…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. μ†Œμœ κΆŒ(Ownership) 기반 μ ‘κ·Ό μ œμ–΄ λ‘œμ§μ„ κ΅¬ν˜„ν•˜μ—¬ μ‚¬μš©μžκ°€ μžμ‹ μ˜ λ°μ΄ν„°λ§Œ μ‘°μž‘ν•˜λ„λ‘ μ œν•œν•  수 μžˆμŠ΅λ‹ˆλ‹€. (Task μ—”λ“œν¬μΈνŠΈ μˆ˜μ •)
  3. SQLAlchemy λͺ¨λΈμ— μ—­ν• /κΆŒν•œ κ΄€λ ¨ ν•„λ“œ(예: is_admin)λ₯Ό μΆ”κ°€ν•˜κ³  Alembic으둜 μŠ€ν‚€λ§ˆ 변경을 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.
  4. νŠΉμ • μ—­ν• (예: κ΄€λ¦¬μž)을 μš”κ΅¬ν•˜λŠ” κ°„λ‹¨ν•œ μ˜μ‘΄μ„± ν•¨μˆ˜λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
  5. μ˜μ‘΄μ„±μ„ μ‚¬μš©ν•˜μ—¬ κ΄€λ¦¬μž μ „μš© μ—”λ“œν¬μΈνŠΈλ₯Ό κ΅¬ν˜„ν•˜κ³  λ³΄ν˜Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  6. 401 Unauthorized와 403 Forbidden HTTP μƒνƒœ μ½”λ“œμ˜ 차이점을 μ΄ν•΄ν•©λ‹ˆλ‹€.