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_user
를 Depends
로 받아와 인증된 사용자만 접근 가능한 로직을 구현할 수 있습니다.
마무리
FastAPI를 사용하여 효율적인 로그인/로그아웃 관리를 구현하는 방법을 살펴보았습니다. JWT를 사용하여 인증 정보를 관리하고, 사용자 모델 및 인증 처리 코드를 구현함으로써 보안을 강화할 수 있습니다. 이러한 방법을 사용하여 FastAPI 프로젝트에서 안전한 사용자 인증을 구현할 수 있습니다.
참고 자료: