파이썬 FastAPI를 활용한 JWT 토큰 재발급 기능 구현 방법

JWT(토큰)은 사용자 인증과 인가를 처리하기 위해 많이 사용되는 방식입니다. JWT 토큰은 유효기간이 있는데, 만약 토큰이 만료되었다면 클라이언트는 새로운 토큰을 발급받아야 합니다. 이번 블로그에서는 파이썬 FastAPI 프레임워크를 사용하여 JWT 토큰 재발급 기능을 구현하는 방법에 대해 알아보겠습니다.

FastAPI와 JWT 라이브러리 설치

우선 FastAPI와 JWT를 사용하기 위해 필요한 라이브러리를 설치해야 합니다. 다음 명령어를 사용하여 설치할 수 있습니다.

pip install fastapi
pip install python-jose[cryptography]

JWT 토큰 발급과 유효성 검사

먼저, JWT 토큰의 발급과 유효성을 검사하는 함수를 구현해야 합니다. 다음은 이를 위한 예시 코드입니다.

from fastapi import HTTPException
from fastapi import Depends
from fastapi.security import OAuth2PasswordBearer
from jose import jwt
from datetime import datetime, timedelta

SECRET_KEY = "your-random-secret-key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token")

def create_access_token(data: dict, expires_delta: timedelta):
    to_encode = data.copy()
    expire = datetime.utcnow() + expires_delta
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt

def validate_token(token: str = Depends(oauth2_scheme)):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        if payload["exp"] < datetime.utcnow():
            raise HTTPException(status_code=401, detail="Token has expired")
        return payload["sub"]
    except jwt.JWTError:
        raise HTTPException(status_code=401, detail="Invalid token")

위 코드에서 create_access_token 함수는 사용자 데이터와 만료 시간을 입력받아 JWT 토큰을 발급하는 역할을 합니다. validate_token 함수는 받은 토큰의 유효성을 검사하고 만료되었거나 잘못된 경우 예외를 발생시킵니다.

JWT 토큰 재발급 기능 구현

이제 JWT 토큰 재발급 기능을 구현해야 합니다. 클라이언트는 재발급을 위해 만료된 토큰을 함께 서버에 보내야 합니다. 서버는 클라이언트가 보낸 토큰의 유효성을 검사한 후, 새로운 토큰을 발급합니다.

다음은 재발급 기능을 구현한 예시 코드입니다.

from fastapi import FastAPI, Depends, HTTPException

app = FastAPI()

@app.get("/refresh_token")
def refresh_token(token: str = Depends(validate_token)):
    ### 토큰을 검증하는 validate_token 함수를 사용하여 유효성을 검사합니다.
    ### 이 함수에서 유효하지 않은 토큰은 HTTP 예외를 발생시킵니다.
    return create_access_token(token_data, timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES))

위 코드에서 /refresh_token 엔드포인트는 클라이언트로부터 받은 토큰을 검증한 후, 새로운 토큰을 발급하여 반환합니다. 이를 통해 클라이언트는 만료된 토큰을 재발급 받아 사용할 수 있습니다.

마무리

이렇게 파이썬 FastAPI를 통해 JWT 토큰의 재발급 기능을 구현할 수 있습니다. 토큰의 유효성을 검증하고, 만료된 토큰을 재발급하는 방법을 소개했습니다. 토큰 기반의 사용자 인증 시스템을 구현할 때, 이러한 기능을 활용하여 보다 안전하고 유연한 인증 시스템을 만들 수 있습니다.

#FastAPI #JWT