개요
웹 애플리케이션에서 다중 계정 로그인 및 권한 관리 시스템을 구현하는 것은 중요한 요소입니다. 이를 위해 파이썬의 FastAPI 프레임워크와 JWT(JSON Web Token)을 활용하면 보안과 효율적인 인증 시스템을 구현할 수 있습니다. 이번 블로그 포스트에서는 FastAPI와 JWT를 이용하여 다중 계정 로그인 및 권한 관리 시스템을 구현하는 방법을 알아보겠습니다.
FastAPI 소개
FastAPI는 파이썬의 웹 프레임워크 중 하나로, 훌륭한 성능과 직관적인 문법을 제공합니다. 비동기 처리를 통해 빠른 속도를 보장하며, 자동 생성되는 API 문서와 풍부한 기능을 갖춘 관리 대시보드 등 개발 생산성을 높여줍니다.
JWT 소개
JWT(JSON Web Token)는 웹 표준으로서, 클라이언트와 서버 간의 인증 정보를 안전하게 전송하는 데 사용됩니다. JWT는 토큰 안에 필요한 정보를 담아 JSON 형태로 인코딩된 문자열로 구성되어 있습니다. 이 토큰은 서버에서 생성되고 클라이언트로 전송되어 인증에 활용됩니다.
다중 계정 로그인 시스템 구현 방법
-
FastAPI 설치: 먼저 FastAPI를 설치해야 합니다. 터미널에서
pip install fastapi
명령어를 실행하여 FastAPI를 설치합니다. -
JWT 라이브러리 설치: JWT를 사용하기 위해 PyJWT 라이브러리를 설치합니다. 터미널에서
pip install PyJWT
명령어를 실행합니다. -
계정 모델 생성: 로그인 시스템을 위해 사용자 계정 모델을 생성합니다. 다음은 간단한 사용자 모델 예시입니다.
from pydantic import BaseModel
class User(BaseModel):
username: str
password: str
- JWT 토큰 생성 함수 생성: JWT 토큰을 생성하기 위한 함수를 작성합니다.
import jwt
from datetime import datetime, timedelta
def create_access_token(username: str):
payload = {
'exp': datetime.utcnow() + timedelta(minutes=30),
'sub': username
}
return jwt.encode(payload, 'secret_key', algorithm='HS256')
- 로그인 API 구현: FastAPI를 사용하여 로그인 API를 구현합니다.
from fastapi import FastAPI, HTTPException
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from .models import User
from .auth import create_access_token
app = FastAPI()
security = HTTPBearer()
@app.post('/login')
def login(user: User):
# 사용자 인증 로직 구현
authorized = True
if authorized:
token = create_access_token(user.username)
return {'access_token': token}
else:
raise HTTPException(status_code=401, detail='Invalid credentials')
@app.get('/protected')
def protected(credentials: HTTPAuthorizationCredentials = security):
# 토큰 유효성 검사 로직 구현
try:
payload = jwt.decode(credentials.credentials, 'secret_key', algorithms=['HS256'])
return {'user': payload['sub']}
except jwt.exceptions.DecodeError:
raise HTTPException(status_code=401, detail='Invalid token')
- 권한 확인 데코레이터 추가: 특정 API에 접근하기 전에 권한을 확인하는 데코레이터를 작성합니다.
from functools import wraps
def authorize():
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# 권한 확인 로직 구현
authorized = True
if authorized:
return func(*args, **kwargs)
else:
raise HTTPException(status_code=403, detail='Access denied')
return wrapper
return decorator
@app.get('/admin')
@authorize()
def admin_only():
return {'message': 'Only admin can access this API'}
- API 테스트: Postman 등을 사용하여 API를 테스트합니다. 로그인 API를 통해 토큰을 발급 받고, 이를 활용해 보호된 API에 접근해볼 수 있습니다.
마무리
이렇게 FastAPI와 JWT를 활용하여 다중 계정 로그인 및 권한 관리 시스템을 구현할 수 있습니다. FastAPI는 훌륭한 성능과 강력한 기능을 제공하며, JWT를 통해 보안적인 요소를 강화할 수 있습니다. 이를 통해 안전하고 효율적인 웹 애플리케이션을 개발할 수 있습니다.
#FastAPI #JWT