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

개요

이번 블로그 포스트에서는 파이썬 FastAPI 프레임워크와 JWT(JSON Web Token)를 사용하여 다중 계정 로그인 및 권한 관리 시스템을 구현하는 방법에 대해 알아보겠습니다. JWT는 클라이언트와 서버 간의 인증을 강력하고 안전하게 처리하기 위해 사용되는 인증 방식입니다. FastAPI는 빠른 속도와 간결한 문법으로 웹 애플리케이션을 개발할 수 있는 파이썬 프레임워크입니다. 이 두 가지 기술을 조합하여 안전하고 확장 가능한 로그인 시스템을 구현할 수 있습니다.

단계별 구현 방법

1. FastAPI 프로젝트 설정

먼저 FastAPI 프로젝트를 설정해야 합니다. 다음 명령어를 사용하여 FastAPI 프로젝트를 생성합니다.

pip install fastapi
pip install uvicorn

2. JWT 패키지 설치

로그인 및 권한 관리 시스템을 구현하기 위해 PyJWT 패키지를 설치해야 합니다. 다음 명령어를 사용하여 PyJWT 패키지를 설치합니다.

pip install pyjwt

3. 사용자 모델 만들기

로그인 시스템을 위해 사용자 모델을 만들어야 합니다. 이를 위해 Pydantic 모델을 사용하겠습니다. 아래 코드는 User 모델의 예입니다.

from pydantic import BaseModel

class User(BaseModel):
    username: str
    password: str

4. JWT 토큰 생성

로그인이 성공한 경우, JWT 토큰을 생성해야 합니다. 아래 코드는 JWT 토큰을 생성하는 함수의 예입니다.

import jwt
from datetime import datetime, timedelta

SECRET_KEY = "YourSecretKey"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30

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

5. 로그인 API 구현

로그인을 처리하기 위해 FastAPI 엔드포인트를 만들어야 합니다. 아래 코드는 로그인을 처리하는 엔드포인트의 예입니다.

from fastapi import FastAPI, HTTPException
from fastapi.security import OAuth2PasswordRequestForm

app = FastAPI()

@app.post("/login")
def login(credentials: OAuth2PasswordRequestForm):
    user = authenticate_user(credentials.username, credentials.password)
    if not user:
        raise HTTPException(status_code=400, detail="Incorrect username or password")
    access_token = create_access_token(data={"sub": user.username})
    return {"access_token": access_token, "token_type": "bearer"}

6. 보호된 엔드포인트 만들기

보호된 엔드포인트를 만들려면 JWT 토큰을 확인해야 합니다. 아래 코드는 보호된 엔드포인트의 예입니다.

from fastapi import Depends
from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/login")

@app.get("/protected")
def protected_route(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 authentication credentials")
        # 권한 검사 및 로직 처리
        # ...
        return {"message": "Access granted"}
    except jwt.ExpiredSignatureError:
        raise HTTPException(status_code=401, detail="Token has expired")

결론

이번에는 파이썬 FastAPI와 JWT를 사용하여 다중 계정 로그인 및 권한 관리 시스템을 구현하는 방법에 대해 알아보았습니다. FastAPI의 빠른 속도와 간결한 문법을 활용하여 안전하고 확장 가능한 시스템을 구축할 수 있습니다. JWT를 사용하여 클라이언트와 서버 간의 인증을 강력하고 안전하게 처리할 수 있습니다. 이를 통해 사용자의 보안과 프라이버시를 보호하며 웹 애플리케이션의 신뢰도를 높일 수 있습니다.

해시태그

#파이썬 #FastAPI #JWT #다중계정 #로그인 #권한관리