ν”„λ‘œμ νŠΈ

일반

μ‚¬μš©μžμ •λ³΄

Actions

μƒˆκΈ°λŠ₯ #51

진행쀑

μƒˆκΈ°λŠ₯ #44: πŸ“˜ Mangement Cloud server FastAPI ν”„λ‘œμ νŠΈ

πŸŸ₯ Epic 1 - Task (Auth Extension) πŸ§‘β€πŸ’» /me & /logout κ΅¬ν˜„

minkyu park이(κ°€) 20일 전에 좔가함.

μƒνƒœ:
μ‹ κ·œ
μš°μ„ μˆœμœ„:
보톡
λ‹΄λ‹Ήμž:
μ‹œμž‘μΌ:
2026/10/01
μ™„λ£ŒμΌ:
진척도:

0%

μΆ”μ •μ‹œκ°„:

μ„€λͺ…

πŸŸ₯ Epic 1 β€” Task (Auth Extension)

πŸ§‘β€πŸ’» /me & /logout κ΅¬ν˜„

πŸ“Œ μž‘μ—… κ°œμš”

둜그인 κΈ°λŠ₯을 ν™•μž₯ν•˜μ—¬

  • ν˜„μž¬ λ‘œκ·ΈμΈν•œ μ‚¬μš©μž 정보λ₯Ό λ°˜ν™˜ν•˜λŠ” /me

  • ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ 토큰을 νκΈ°ν•˜λŠ” /logout

    APIλ₯Ό κ΅¬ν˜„ν•œλ‹€.

이 두 κΈ°λŠ₯은 DB μ—°κ²° 없이도 JWT만으둜 ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•˜λ‹€.

πŸ› οΈ 1. JWT 인증 미듀웨어 λ§Œλ“€κΈ°

πŸ“ app/core/auth.py

from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from jose import jwt, JWTError

from app.core.jwt import SECRET_KEY, ALGORITHM

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login")

def get_current_user(token: str = Depends(oauth2_scheme)):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        username: str = payload.get("sub")

        if username is None:
            raise HTTPException(status_code=401, detail="Invalid token")

        return username

    except JWTError:
        raise HTTPException(status_code=401, detail="Invalid or expired token")

πŸ“Œ DB 없이도 username을 JWTμ—μ„œ λ°”λ‘œ κΊΌλ‚Ό 수 있음

πŸ› οΈ 2. /me API κ΅¬ν˜„

πŸ“ app/routers/auth.py에 μΆ”κ°€

@router.get("/me")
def me(current_user: str = Depends(get_current_user)):
    return {"username": current_user}

πŸ“Œ JWT만 있으면 λ°”λ‘œ ν…ŒμŠ€νŠΈ κ°€λŠ₯
πŸ“Œ DB μ—°κ²° ν•„μš” μ—†μŒ

πŸ› οΈ 3. /logout API κ΅¬ν˜„

FastAPIλŠ” μ„œλ²„μ—μ„œ JWTλ₯Ό κ°•μ œλ‘œ λ¬΄νš¨ν™”ν•  수 μ—†λ‹€.

JWTλŠ” β€œμ„œλ²„κ°€ κΈ°μ–΅ν•˜μ§€ μ•ŠλŠ” 토큰”이기 λ•Œλ¬Έ.

κ·Έλž˜μ„œ 일반적인 방식은:

βœ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 토큰을 λ²„λ¦¬λŠ” 방식

β†’ /logout은 κ·Έλƒ₯ β€œμ„±κ³΅β€λ§Œ λ°˜ν™˜ν•˜λ©΄ 됨.

@router.post("/logout")
def logout():
    return {"detail": "Logged out. Please delete your token on client side."}

πŸ“Œ ν΄λΌμ΄μ–ΈνŠΈ(PWA, μ•±, μ›Ή)μ—μ„œ 토큰을 μ‚­μ œν•˜λ©΄ λ‘œκ·Έμ•„μ›ƒ μ™„λ£Œ

πŸ“Œ μ„œλ²„λŠ” 토큰을 μ €μž₯ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— β€œλ¬΄νš¨ν™”β€λΌλŠ” κ°œλ…μ΄ μ—†μŒ

πŸ§ͺ 4. test_main.http ν…ŒμŠ€νŠΈ

DB 없어도 λ°”λ‘œ ν…ŒμŠ€νŠΈ κ°€λŠ₯

### Login (DB μ—°κ²° ν›„ ν…ŒμŠ€νŠΈ)
POST http://127.0.0.1:8000/login
Content-Type: application/json

{
  "username": "admin",
  "password": "1234"
}

### Me Test
GET http://127.0.0.1:8000/me
Authorization: Bearer {{token}}

### Logout Test
POST http://127.0.0.1:8000/logout

πŸ“Œ μ‚°μΆœλ¬Ό

  • JWT 인증 미듀웨어 (get_current_user)

  • /me API κ΅¬ν˜„

  • /logout API κ΅¬ν˜„

  • DB 없이도 ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•œ 인증 흐름 μ™„μ„±

ν‘œμ‹œν•  데이터가 μ—†μŠ΅λ‹ˆλ‹€.

Actions

내보내기 Atom PDF