
AI 엔지니어를 위한 FastAPI - 파트 6: FastAPI에서의 JWT 인증 (JWT Authentication)
요약
FastAPI를 사용하여 JWT(JSON Web Token) 기반의 인증 시스템을 구축하는 방법을 다룹니다. 인증과 인가의 개념적 차이를 넘어 실제 애플리케이션에 적용 가능한 구현 기술을 제공합니다.
핵심 포인트
- 인증(Authentication)과 인가(Authorization)의 차이점 이해
- FastAPI 환경에서의 JWT 인증 시스템 구축 방법
- 보호된 리소스에 접근하기 위한 실제 구현 프로세스 학습
이전 기사에서 우리는 인증 (Authentication)과 인가 (Authorization)의 개념을 살펴보았습니다.
우리는 다음을 배웠습니다:
- 인증 (Authentication)은 **"당신은 누구입니까?"**라는 질문에 답합니다.
- 인가 (Authorization)는 **"당신은 무엇을 할 수 있습니까?"**라는 질문에 답합니다.
개념을 이해하는 것도 중요하지만, 실제 애플리케이션에서는 실제 구현이 필요합니다.
만약 Gmail, LinkedIn, GitHub 또는 ChatGPT를 사용해 본 적이 있다면, 이미 수없이 많은 인증 시스템을 사용해 본 것입니다.
사용자 이름과 비밀번호를 입력하면 애플리케이션이 신원을 확인하고, 보호된 리소스에 접근할 수 있게 됩니다.
하지만 이것이 실제로 배후에서 어떻게 작동할까요?
이 기사에서는 FastAPI를 사용하여 완전한 JWT 인증 (JWT Authentication) 시스템을 구축할 것입니다.
이전 기사를 읽지 않았다면, 먼저 확인해 보세요:
Ananya S
팔로우
FastAPI for AI Engineers - Part 5: Authentication vs Authorization (And Why Most Beginners Confuse Them)
읽기 시간 3분
왜 인증 (Authentication)이 필요한가요?
AI 기반 학습 플랫폼을 구축한다고 상상해 보세요.
인증 없이 사용한다면:
- 누구나 다른 사용자의 프로필에 접근할 수 있습니다.
- 누구나 다른 학생의 학습 진행 상황을 볼 수 있습니다.
- 누구나 다른 사용자의 데이터를 수정할 수 있습니다.
분명히 이것은 보안 문제입니다.
애플리케이션에는 다음과 같은 기능이 필요합니다:
- 사용자 신원 확인 (Verify user identity)
- 민감한 리소스 보호 (Protect sensitive resources)
- 사용자가 로그인 상태를 유지할 수 있도록 허용 (Allow users to stay logged in)
이 지점에서 JWT 인증 (JWT Authentication)이 등장합니다.
JWT란 무엇인가요?
JWT는 JSON Web Token의 약자입니다.
JWT는 사용자에 대한 정보를 포함하는 보안 토큰입니다.
모든 요청마다 사용자 이름과 비밀번호를 보내는 대신, 사용자는 토큰을 보냅니다.
일반적인 흐름:
사용자 등록 (Register User)
↓
로그인 (Login)
...
필수 패키지 설치
pip install python-jose passlib[bcrypt]
다음 패키지들을 사용할 것입니다:
- 비밀번호 해싱 (Password hashing)을 위한
passlib - JWT 토큰 생성 및 검증을 위한
python-jose
1단계: 비밀번호 해싱 (Hashing Passwords)
비밀번호를 평문 (Plain text)으로 저장하는 것은 매우 위험합니다.
절대로 다음과 같이 하지 마세요:
users = {
"rahul": "password123"
}
만약 데이터베이스가 침해되면, 모든 사용자의 비밀번호가 노출됩니다.
대신, 해싱된 (Hashed) 버전을 저장해야 합니다.
비밀번호 해셔 (Password Hasher) 생성하기
from passlib.context import CryptContext
pwd_context = CryptContext(
...
CryptContext란 무엇인가요?
CryptContext는 비밀번호 해싱 알고리즘을 관리합니다.
이 예제에서는:
schemes=["bcrypt"]
FastAPI가 bcrypt 해싱 알고리즘을 사용하도록 설정합니다.
비밀번호 해싱하기
hashed_password = pwd_context.hash("password123")
print(hashed_password)
출력 결과:
$2b$12$.....
원본 비밀번호가 더 이상 보이지 않는다는 점에 주목하세요.
비밀번호 검증하기 (Verifying Passwords)
사용자가 로그인할 때:
pwd_context.verify(
"password123",
hashed_password
...
결과값으로 다음을 반환합니다:
True
이를 통해 비밀번호를 평문으로 저장하지 않고도 검증할 수 있습니다.
2단계: 사용자 등록 (User Registration)
간단한 등록 엔드포인트 (Registration endpoint)를 만들어 보겠습니다.
from fastapi import FastAPI
app = FastAPI()
...
여기서 어떤 일이 일어나나요?
- 사용자가 사용자 이름(username)과 비밀번호(password)를 제출합니다.
- 비밀번호가 해싱(hashed)됩니다.
- 원래의 비밀번호 대신 해시(Hash)가 저장됩니다.
단계 3: 사용자 로그인 (User Login)
이제 자격 증명(credentials)을 검증해 보겠습니다.
@app.post("/login")
def login(username: str, password: str):
...
이 시점에서 사용자는 성공적으로 로그인할 수 있습니다.
하지만, 사용자들은 여전히 모든 요청마다 사용자 이름과 비밀번호를 보내야 합니다.
JWT가 이 문제를 해결합니다.
단계 4: JWT 토큰 생성 (Creating a JWT Token)
from jose import jwt
from datetime import datetime, timedelta
...
왜 비밀 키(secret key)가 필요한가요?
비밀 키(secret key)는 토큰에 서명(sign)하는 데 사용됩니다.
만약 누군가 토큰을 수정하면, 서명(signature)은 무효화됩니다.
토큰 생성 함수 (Generate Token Function)
def create_access_token(data: dict):
to_encode = data.copy()
...
이 함수는 무엇을 하나요?
- 사용자 데이터를 복사합니다.
- 만료 시간(expiry time)을 추가합니다.
- 서명된 JWT 토큰을 생성합니다.
- 토큰을 반환합니다.
단계 5: 로그인 중 토큰 생성 (Generate Token During Login)
@app.post("/login")
def login(username: str, password: str):
...
이제 성공적인 로그인은 다음을 반환합니다:
{
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "bearer"
...
단계 6: 보호된 경로 (Protected Route)
이제 경로(routes)를 보호할 수 있습니다.
@app.get("/profile")
def get_profile():
...
현재는 누구나 접근할 수 있습니다.
프로덕션 애플리케이션(production applications)에서 FastAPI는 접근을 허용하기 전에 JWT 토큰을 검증합니다.
다음 글에서 완전한 경로 보호(route protection)를 구현할 것입니다.
지금은 다음 사항을 이해하는 데 집중하세요:
- 회원가입 (Registration)
- 비밀번호 해싱 (Password Hashing)
- 비밀번호 검증 (Password Verification)
- JWT 생성 (JWT Generation)
이것들이 모든 인증 시스템(authentication system)의 기초를 형성합니다.
인증 흐름 요약 (Authentication Flow Recap)
사용자 등록 (Register User)
↓
비밀번호 해싱 (Hash Password)
...
마치며 (Final Thoughts)
오늘 우리는 JWT 인증(JWT Authentication)의 핵심 구성 요소를 구축했습니다:
- 사용자 등록 (User Registration)
- 비밀번호 해싱 (Password Hashing)
- 비밀번호 검증 (Password Verification)
- JWT 토큰 생성 (JWT Token Generation)
이제 사용자는 등록하고, 로그인하며, 서명된 JWT 토큰을 받을 수 있습니다.
하지만, 토큰을 생성하는 것은 이야기의 절반에 불과합니다.
다음 단계는 FastAPI 의존성 (Dependencies)을 사용하여 토큰을 검증하고 경로 (Routes)를 보호하는 방법을 배우는 것입니다.
다음 글에서는 JWT 기반의 경로 보호 (Route Protection)를 구현하고, 역할 기반 액세스 제어 (RBAC, Role-Based Access Control)를 탐구하기 시작할 것입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기