파이썬 FastAPI와 JWT를 활용한 안전한 API 인증 구현 방법

API 개발 시 사용자 인증은 보안과 중요한 부분입니다. 이를 위해 FastAPI와 JWT(JSON Web Token)를 함께 사용하면 안전하고 간편한 인증 구현을 할 수 있습니다. 이번 블로그 포스트에서는 FastAPI와 JWT를 활용한 API 인증 구현 방법을 알아보겠습니다.

FastAPI와 JWT 소개

FastAPI는 Python으로 빠르게 API를 개발하도록 도와주는 웹 프레임워크입니다. ASGI 기반으로 동작하며, 빠른 속도와 현대적인 기능을 제공합니다. FastAPI 개발자는 자동화된 API 문서 생성, 데이터 유효성 검증 등을 간편하게 구현할 수 있습니다.

JWT(JSON Web Token)는 클라이언트와 서버 간 정보를 안전하게 전송하기 위한 인증 방식입니다. 웹 토큰이라고도 불리며, 토큰 자체에 정보를 담고 있어 별도의 세션 상태를 유지할 필요가 없습니다. JWT는 토큰의 진정한 서명을 통해 안전성을 보장합니다.

FastAPI에서 JWT 사용하기

  1. FastAPI 애플리케이션에 PyJWT 패키지를 설치합니다.
pip install PyJWT
  1. JWT 토큰 생성 및 검증을 담당할 jwt_manager.py 파일을 생성합니다.
import jwt
from datetime import datetime, timedelta

SECRET_KEY = "your-secret-key"  # 보안을 위한 비밀 키
ALGORITHM = "HS256"  # 알고리즘

class JWTManager:
    @staticmethod
    def create_token(data: dict, expires_delta: timedelta):
        data_to_encode = data.copy()
        expire = datetime.utcnow() + expires_delta
        data_to_encode.update({"exp": expire})
        encoded_jwt = jwt.encode(data_to_encode, SECRET_KEY, algorithm=ALGORITHM)
        return encoded_jwt

    @staticmethod
    def decode_token(token: str):
        try:
            decoded_token = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
            return decoded_token
        except jwt.ExpiredSignatureError:
            # 토큰이 만료된 경우 처리
            raise
        except jwt.InvalidSignatureError:
            # 토큰의 서명이 유효하지 않은 경우 처리
            raise
        except jwt.DecodeError:
            # 토큰의 디코딩에 실패한 경우 처리
            raise
        except:
            # 그 외 예외 처리
            raise
  1. FastAPI 라우터에서 JWT를 사용하여 인증을 구현합니다.
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from datetime import timedelta

from jwt_manager import JWTManager

app = FastAPI()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/login")  # 토큰을 얻기 위한 URL

# 토큰 검증을 위한 의존성 주입
async def get_current_user(token: str = Depends(oauth2_scheme)):
    try:
        payload = JWTManager.decode_token(token)
        # 토큰에 담긴 정보를 기반으로 유저 정보를 조회하고 반환
        # 예: 유저 정보 데이터베이스에서 조회
        return payload['user_id']
    except:  # 토큰 검증 실패
        raise HTTPException(status_code=401, detail="Invalid Token")

@app.get("/items/")
async def read_items(token: str = Depends(get_current_user)):
    # 인증이 필요한 작업 수행
    return {"user_id": token, "items": ["Foo", "Bar", "Baz"]}

@app.post("/login")
async def login():
    # 사용자 인증 후 JWT 토큰 생성
    user_id = "my_user_id"
    access_token = JWTManager.create_token({"user_id": user_id}, timedelta(minutes=30))
    return {"access_token": access_token, "token_type": "bearer"}
  1. FastAPI 서버를 실행하고 API 테스트를 진행합니다.
uvicorn main:app --reload

FastAPI와 JWT를 활용하여 파이썬 API에 안전하고 간편한 인증 방식을 구현하는 방법을 알아보았습니다. JWT는 인증 정보를 토큰에 저장하기 때문에 별도의 세션 상태를 유지할 필요가 없어 매우 편리합니다. FastAPI와 함께 사용하면 높은 보안 수준을 유지하면서 빠르고 효율적인 API 개발을 할 수 있습니다.

#FastAPI #JWT