
AI 엔지니어를 위한 FastAPI - 파트 7: JWT 토큰을 이용한 라우트 보호
요약
FastAPI를 사용하여 JWT 토큰을 검증하고 특정 라우트를 보호하는 방법을 다룹니다. 사용자 식별을 통해 권한 없는 접근을 차단하는 보안 구현 과정을 설명합니다.
핵심 포인트
- JWT 토큰 생성 이후의 검증 단계 중요성 설명
- FastAPI를 활용한 엔드포인트 접근 권한 제어
- 사용자 식별을 통한 보안 라우트 보호 구현
이전 글에서 우리는 다음 내용들을 배웠습니다:
- 사용자 등록
- bcrypt를 사용한 비밀번호 해싱 (Hash)
- 로그인 시 비밀번호 검증
- JWT 토큰 생성
하지만 토큰을 생성하는 것만으로는 애플리케이션을 안전하게 보호할 수 없습니다.
접근 권한을 부여하기 전에 토큰을 검증하지 않는다면, 누구나 여전히 엔드포인트(endpoints)에 접근할 수 있습니다.
오늘 우리는 FastAPI가 JWT 토큰으로부터 어떻게 사용자를 식별하고, 권한이 없는 접근으로부터 라우트(routes)를 보호하는지 배울 것입니다.
이 내용을 이해하기 위해 이전 게시물을 확인해 보세요:
FastAPI for AI Engineers - Part 6: JWT Authentication in FastAPI
Ananya S
팔로우
FastAPI for AI Engineers - Part 6: JWT Authentication in FastAPI
4분 읽기
문제점
다음과 같은 상황을 가정해 봅시다:
@app.get("/profile")
def get_profile():
return {"message": "My profile"}
누구나 이 엔드포인트에 접근할 수 있습니다.
다음 사항들에 대한 검증이 전혀 없습니다:
- 누가 요청을 보내고 있는가
- 로그인 상태인가
- 토큰이 유효한가
인증 흐름 (Authentication Flow)
로그인 (Login)
↓
JWT 생성 (Generate JWT)
...
토큰 추출하기
OAuth2PasswordBearer
OAuth2PasswordBearer는 Password flow와 Bearer 토큰을 사용하는 OAuth2를 통해 보안 및 인증을 처리하기 위해 FastAPI에서 제공하는 클래스입니다. 이 클래스는 FastAPI 애플리케이션에서 안전한 인증을 구현하는 과정을 단순화해 줍니다.
OAuth2PasswordBearer를 사용하려면 해당 클래스의 인스턴스를 생성하고 tokenUrl 파라미터를 전달해야 합니다. 이 파라미터는 클라이언트가 토큰을 얻기 위해 사용자 이름(username)과 비밀번호(password)를 보낼 URL을 지정합니다.
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(
tokenUrl="login"
...
요청이 도착하면:
Authorization: Bearer eyJhbGc...
FastAPI가 자동으로 토큰을 추출합니다.
JWT 토큰 디코딩 (Decoding JWT Tokens)
from jose import jwt
from jose import JWTError
def verify_token(token: str):
...
JWT에는 다음 내용이 포함되어 있습니다:
{
"sub": "suman",
"exp": ...
...
우리는 "sub"에서 사용자 이름(username)을 추출합니다.
get_current_user() 생성하기
이것이 가장 중요한 개념입니다.
from fastapi import Depends
def get_current_user(
...
모든 보호된 엔드포인트(protected endpoint)는 다음과 같이 사용합니다:
Depends(get_current_user)
이를 통해 등록된 사용자 중 JWT 토큰이 검증된 사용자만이 보호된 라우트(protected route)에 접근할 수 있도록 보장합니다.
라우트 보호하기 (Protecting Routes)
@app.get("/profile")
def get_profile(
current_user: str = Depends(
...
이제:
유효한 토큰 (JWT 토큰이 일치하여 접근이 허용된 경우)
{
"message": "Welcome suman"
}
유효하지 않은 토큰 (접근이 허용되지 않음)
{
"detail": "Could not validate credentials"
}
시각적 흐름 (Visual Flow)
User Login
↓
JWT Token Generated
...
결론 (Conclusion)
오늘 우리는 다음 내용을 배웠습니다:
- OAuth2PasswordBearer
- JWT 토큰 추출 (Extracting JWT tokens)
- JWT 토큰 디코딩 (Decoding JWT tokens)
- get_current_user() 생성
- Depends()를 사용한 라우트 보호 (Protecting routes using Depends())
다음 기사에서는 인증(authentication)을 넘어, 서로 다른 사용자에게 서로 다른 권한을 부여하는 역할 기반 액세스 제어 (RBAC, Role-Based Access Control)를 구현해 보겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기