파이썬 FastAPI와 JWT를 활용한 다중 계정 로그인 및 권한 관리 시스템 구현 방법

서론

현대 웹 애플리케이션에서는 다중 계정 로그인 및 권한 관리 시스템이 중요한 요소입니다. 이를 구현하기 위해서는 안전하고 강력한 인증 및 권한 부여 메커니즘이 필요합니다. 이번 블로그 포스트에서는 파이썬의 FastAPI 프레임워크와 JWT(JSON Web Token)를 조합하여 다중 계정 로그인 및 권한 관리 시스템을 구현하는 방법을 알아보겠습니다.

FastAPI 소개

FastAPI는 파이썬을 기반으로한 현대적이고 고성능의 웹 프레임워크입니다. 이 프레임워크는 async/await 문법을 활용하여 빠른 속도와 높은 생산성을 제공합니다. FastAPI는 기본적으로 OAuth2 및 JWT 지원을 제공하므로 API 인증 시스템을 구축하기에 이상적입니다.

JWT(JSON Web Token) 소개

JWT는 웹 애플리케이션에서 사용자 인증을 위한 인증 수단으로 널리 사용되고 있는 토큰 기반의 인증 방식입니다. JWT는 토큰 자체에 정보를 포함하고 있으며, 이를 통해 클라이언트 간에 안전하게 정보를 교환할 수 있습니다. JWT는 세션 없이 상태를 관리할 수 있으며, 믿을 수 있는 토큰 서명을 통해 인증 및 권한 부여를 수행할 수 있습니다.

다중 계정 로그인 및 권한 관리 시스템 구현 방법

다음은 파이썬 FastAPI와 JWT를 활용하여 다중 계정 로그인 및 권한 관리 시스템을 구현하는 단계입니다.

  1. FastAPI와 필요한 패키지를 설치합니다.
pip install fastapi[all] python-jose passlib
  1. 사용자 모델을 정의합니다.
from pydantic import BaseModel

class User(BaseModel):
    username: str
    password: str
    role: str
  1. 사용자 데이터베이스를 구현합니다.
from fastapi import FastAPI

app = FastAPI()

@app.post("/register")
def register_user(user: User):
    # 사용자 정보를 저장하는 로직을 구현합니다.
    # 예: 데이터베이스에 사용자 정보를 저장하고 암호를 해싱합니다.
    return {"message": "User registered successfully"}
  1. 로그인 및 토큰 생성을 처리하는 엔드포인트를 구현합니다.
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from jose import JWTError, jwt
from passlib.context import CryptContext

app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

@app.post("/token")
def login(user: User):
    # 사용자 정보를 확인하여 유효한 사용자인지 검증합니다.
    # 예: 데이터베이스에서 사용자 정보를 가져와 비밀번호를 확인합니다.
    is_valid_user = True # 임시로 유효한 사용자로 가정합니다.
    
    if not is_valid_user:
        raise HTTPException(status_code=400, detail="Invalid credentials")
    
    # JWT 토큰을 생성합니다.
    access_token = jwt.encode({"sub": user.username}, "secretKey")
    return {"access_token": access_token, "token_type": "bearer"}
  1. 보호된 엔드포인트를 구현합니다.
@app.get("/protected")
def protected_route(token: str = Depends(oauth2_scheme)):
    # 토큰이 유효한지 인증 및 권한 부여 로직을 구현합니다.
    # 예: JWT의 서명을 확인하여 토큰이 변조되었는지 확인합니다.
    try:
        payload = jwt.decode(token, "secretKey", algorithms=["HS256"])
        # 토큰에서 사용자 정보 추출 및 필요한 권한 확인 등 추가 로직 구현
    except JWTError:
        raise HTTPException(status_code=401, detail="Invalid token")
    
    return {"message": "Access granted"}
  1. 애플리케이션을 실행하고 API를 테스트합니다.

결론

이렇게 FastAPI와 JWT를 활용하여 다중 계정 로그인 및 권한 관리 시스템을 구현할 수 있습니다. FastAPI의 높은 성능과 JWT의 강력한 인증 및 권한 제어 메커니즘을 결합하여 안전하고 확장 가능한 웹 애플리케이션을 구축할 수 있습니다.

#FastAPI #JWT