JWT(Json Web Token)
- 주로 사용자 인증(Authentication) 과 인가(Authorization) 를 처리할 때 사용
- ex. 로그인 시 클라이언트에게 토큰을 발급하고, 이후 요청마다 이 토큰을 헤더에 담아 인증을 수행
| 개념 | 설명 |
|---|
| JWT | JSON 형태로 인코딩된 토큰. 서버는 로그인 시 유저 정보를 암호화해 토큰을 발급함. |
| Header | 어떤 알고리즘으로 암호화했는지를 나타냄 (예: HS256). |
| Payload | 사용자 정보(예: user_id, username)와 만료 시간(exp) 등을 담음. |
| Signature | 서버 비밀키로 Header + Payload 를 서명해 위조 방지용으로 사용. |
예시
from datetime import datetime, timedelta
from typing import Optional
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import JWTError, jwt
from pydantic import BaseModel
SECRET_KEY = "secret-key-example"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
fake_user_db = {
"kihoon": {
"username": "kihoon",
"password": "1234",
}
}
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
to_encode = data.copy()
expire = datetime.now() + (expires_delta or timedelta(minutes=15))
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/login")
app = FastAPI()
class Token(BaseModel):
access_token: str
token_type: str
class User(BaseModel):
username: str
@app.post("/login", response_model=Token)
def login(form_data: OAuth2PasswordRequestForm = Depends()):
user = fake_user_db.get(form_data.username)
if not user or user["password"] != form_data.password:
raise HTTPException(status_code=400, detail="Invalid credentials")
access_token = create_access_token(data={"sub": user["username"]})
return {"access_token": access_token, "token_type": "bearer"}
@app.get("/users/me", response_model=User)
def read_users_me(token: str = Depends(oauth2_scheme)):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username = payload.get("sub")
if username is None:
raise HTTPException(status_code=401, detail="Invalid token")
return {"username": username}
except JWTError:
raise HTTPException(status_code=401, detail="Invalid token")