[python] FastAPI에서 효율적인 로그인/로그아웃 관리하기

FastAPI는 빠르고 간편한 웹 애플리케이션 개발을 가능하게 해주는 Python 웹 프레임워크입니다. 이번 블로그 게시물에서는 FastAPI를 사용하여 효율적인 로그인/로그아웃 관리를 구현하는 방법에 대해 알아보겠습니다.

1. JWT (JSON Web Token) 이해하기

JWT는 사용자의 인증 정보를 안전하게 전송하기 위한 토큰 기반 인증 방식입니다. 이 토큰은 사용자의 세션 정보를 포함하고 있으며, 클라이언트에서 서버로 전송될 때마다 검증 과정이 수행됩니다. FastAPI에서 JWT를 사용하여 로그인/로그아웃 관리를 구현할 수 있습니다.

2. 사용자 모델 및 인증 처리 구현하기

FastAPI에서 로그인/로그아웃 처리를 위해 사용자 모델과 관련된 코드를 구현해야 합니다. 사용자 모델은 데이터베이스에 저장된 사용자 정보를 나타내는 클래스입니다. 사용자의 이메일과 암호화된 비밀번호를 저장하고 필요한 경우 사용자의 권한 정보도 추가할 수 있습니다.

from pydantic import BaseModel

class User(BaseModel):
    email: str
    hashed_password: str
    is_active: bool

    def verify_password(self, password):
        # 비밀번호 검증 로직 구현하기
        pass

위의 코드에서는 Pydantic을 사용하여 사용자 모델을 정의하였습니다. 사용자 모델은 이메일, 암호화된 비밀번호, 활성 여부를 포함하고 있으며, verify_password 메서드를 통해 비밀번호를 검증할 수 있습니다.

3. 로그인 엔드포인트 구현하기

FastAPI에서 로그인을 처리하기 위한 엔드포인트를 구현해야 합니다. 이 엔드포인트는 사용자가 제공한 이메일과 비밀번호를 검증하고, 유효한 경우 JWT 토큰을 생성하여 반환해야 합니다. 이 JWT 토큰은 사용자의 인증에 필요한 정보를 담고 있습니다.

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

app = FastAPI()

def authenticate_user(email: str, password: str):
    user = get_user_from_db(email)
    if not user or not user.verify_password(password):
        raise HTTPException(status_code=401, detail="Incorrect email or password")
    return user

@app.post("/login/")
def login(form_data: OAuth2PasswordRequestForm = Depends()):
    user = authenticate_user(form_data.username, form_data.password)
    # JWT 토큰 생성 및 반환 로직 구현하기
    return {"access_token": access_token, "token_type": "bearer"}

로그인 엔드포인트에서는 OAuth2PasswordRequestForm을 사용하여 사용자가 제공한 이메일과 비밀번호를 받아옵니다. authenticate_user 함수를 통해 이 정보를 검증하고, 검증에 실패한 경우 예외를 발생시킵니다. 검증에 성공한 경우 JWT 토큰을 생성하고 반환합니다.

4. 인증된 사용자만 접근 가능한 엔드포인트 보호하기

로그인된 사용자만 접근 가능한 엔드포인트를 보호하기 위해서는 FastAPI의 Depends를 사용하여 사용자를 인증하는 로직을 추가해야 합니다. 이를 통해 인증되지 않은 사용자의 요청을 거부할 수 있습니다.

from fastapi import Depends
from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login")

def get_current_user(token: str = Depends(oauth2_scheme)):
    # JWT 토큰 검증 및 유저 반환 로직 구현하기
    return current_user

@app.get("/protected/")
def protected_route(current_user: User = Depends(get_current_user)):
    # 인증된 사용자만 접근 가능한 로직 구현하기
    return {"message": "Protected route"}

Depends를 사용하여 get_current_user 함수를 호출하면, 이 함수는 전달된 JWT 토큰을 검증하고 유저를 반환합니다. protected_route 엔드포인트에서는 current_userDepends로 받아와 인증된 사용자만 접근 가능한 로직을 구현할 수 있습니다.

마무리

FastAPI를 사용하여 효율적인 로그인/로그아웃 관리를 구현하는 방법을 살펴보았습니다. JWT를 사용하여 인증 정보를 관리하고, 사용자 모델 및 인증 처리 코드를 구현함으로써 보안을 강화할 수 있습니다. 이러한 방법을 사용하여 FastAPI 프로젝트에서 안전한 사용자 인증을 구현할 수 있습니다.


참고 자료: