JWT
1. 인증(Authentication)
인증은 시스템이나 서비스가 사용자가 누구인지 확인하는 과정
FastAPI에서의 인증 방식
- 세션 기반: Depends와 같은 의존성 주입을 통해 쉽게 구현 가능, 쿠키 기반의 세션 관리를 사용
- 토큰 기반: Bearer토큰(와)과 같은 인증 스키마를 사용해 JWT 기반 인증을 구현 일반적
2. JWT이란?
JWT는 주로 인증 목적으로 사용되며, 토큰 안에 사용자의 인증 정보를 포함하고 있어 서버가 별도로 상태를 유지할 필요가 없습니다.
JWT의 구조
- Header(헤더): 토큰의 타입(JWT)과 서명 생성에 사용된 암호화 알고리즘(예: HS256) 정보가 담깁니다.
- Payload(페이로드): 토큰에 담을 실제 정보(사용자 식별 ID, 권한, 토큰 만료 시간 등)가 Key-Value 형태의 '클레임(Claim)'으로 포함됩니다.
- Signature(서명): 헤더와 페이로드를 서버가 가지고 있는 비밀키(Secret Key)로 암호화한 값입니다. 이를 통해 토큰의 위변조 여부를 검증합니다.
JWT 인증 동작 방식
- 사용자가 아이디와 비밀번호로 로그인을 요청합니다.
- 서버는 검증 후 , 사용자 정보와 비밀키를 이용해 JWT 토큰을 발급하여 클라이언트에게 전달합니다.
- 클라이언트는 이 토큰을 저장하고, 서버에 요청을 보낼 때마다 HTTP 헤더(Authorization)에 토큰을 포함시켜 보냅니다.
- 서버는 토큰의 서명(Signature)을 복호화하고 검증하여 변조되지 않았는지, 만료되지는 않았는 지 확인 후 요청을 처리합니다.
JWT의 장단점
장점
- 무상태성: 서버가 세션 상태를 기억할 필요 없이 토큰 하나로 사용자를 인증하므로 서버 확정성이 뛰어납니다.
- 자체 포함: 토큰 안에 필요한 모든 정보가 들어있어 데이터베이스 조회를 줄일 수 있습니다.
단점
- 토큰 무효화의 어려움: 한 번 발급된 토큰은 서버에서 강제로 만료시킬 수 없어 보안상 위험(토큰 탈취 등)이 있을 수 있습니다.
- 데이터 크기: 페이로드에 많은 정보를 담을수록 토큰의 길이가 길어져 네트워크 트래픽에 영향을 줄 수 있습니다.
3. FastAPI에서 JWT 사용법
JWT 인증을 구현하기 위해서는 크게 5단계를 거친다.
① 필요한 라이브러리 설치 및 불러오기
JWT 인증을 위해 필요한 라이브러리를 설치한다.
pip install pyjwt bcrypt
import jwt
import bcrypt
from fastapi.security import OAuth2PasswordBearer
from datetime import datetime, timedelta, timezone
② 비밀키와 JWT 설정
JWT를 생성하고 검증하기 위해 서버만 알고 있는 비밀키를 설정한다.
SECRET_KEY = "super-secret-key-change-this-in-production"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
- SECRET_KEY : 토큰 생성 및 검증에 사용하는 비밀키
- ALGORITHM : JWT 암호화 알고리즘
- ACCESS_TOKEN_EXPIRE_MINUTES : 토큰 유효 시간
실제 서비스에서는 SECRET_KEY를 코드에 직접 작성하지 않고 .env 파일에 저장하여 사용한다.
③ OAuth2PasswordBearer 생성
FastAPI는 JWT를 쉽게 사용할 수 있도록 OAuth2PasswordBearer를 제공한다.
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login")
여기서
tokenUrl="login"
은 토큰을 발급받는 로그인 주소를 의미한다.
JWT가 필요한 API에서는
token: str = Depends(oauth2_scheme)
만 작성하면 자동으로
Authorization: Bearer JWT토큰
헤더에서 토큰을 읽어온다.
④ JWT 토큰 생성
로그인 성공 시 JWT 토큰을 생성하여 사용자에게 반환한다.
def create_access_token(data: dict,
expires_delta: Optional[timedelta] = None):
to_encode = data.copy()
expire = datetime.now(timezone.utc) + (
expires_delta or timedelta(minutes=15)
)
to_encode.update({"exp": expire})
return jwt.encode(
to_encode,
SECRET_KEY,
algorithm=ALGORITHM
)
토큰에는 보통 다음 정보를 저장한다.
{
"sub": username,
"exp": 만료시간
}
- sub : 사용자 식별 정보
- exp : 토큰 만료 시간
로그인 성공 시
access_token = create_access_token(
data={"sub": user["username"]},
expires_delta=timedelta(minutes=30)
)
return {
"access_token": access_token,
"token_type": "bearer"
}
형태로 클라이언트에게 전달한다.
⑤ JWT 토큰 검증
JWT가 필요한 API에서는 전달받은 토큰을 검증한다.
payload = jwt.decode(
token,
SECRET_KEY,
algorithms=[ALGORITHM]
)
토큰에서 사용자 정보를 꺼낸다.
username = payload.get("sub")
토큰이
- 변조되었거나
- 만료되었거나
- 올바르지 않으면
예외를 발생시킨다.
except jwt.PyJWTError:
raise HTTPException(
status_code=401,
detail="Could not validate credentials"
)
이후 DB에서 사용자를 조회하여 실제 존재하는 계정인지 확인한다.
SELECT username
FROM users
WHERE username = ?
존재하면 인증 성공이다.
4. JWT 인증 과정
JWT 인증은 다음 순서로 동작한다.
① 회원가입
│
▼
DB에 사용자 저장
│
▼
② 로그인
(ID / Password)
│
▼
비밀번호 검증
│
▼
JWT 생성
│
▼
클라이언트에게 전달
│
▼
클라이언트가 토큰 저장
(LocalStorage, SessionStorage 등)
│
▼
API 요청
Authorization: Bearer JWT
│
▼
FastAPI가 JWT 검증
│
▼
사용자 정보 확인
│
▼
API 실행
5. 주요 JWT 함수
함수설명
| jwt.encode() | JWT 생성 |
| jwt.decode() | JWT 검증 및 데이터 추출 |
| OAuth2PasswordBearer() | Authorization 헤더에서 Bearer 토큰 추출 |
| Depends() | JWT 인증을 필요한 API에 적용 |
| create_access_token() | JWT 생성 함수 |
6. JWT와 세션 로그인 비교
구분세션 로그인JWT 로그인
| 인증 정보 저장 | 서버(Session) | 클라이언트(Token) |
| 서버 상태 | Stateful | Stateless |
| 서버 메모리 | 사용 | 거의 사용하지 않음 |
| 확장성 | 낮음 | 높음 |
| 로그아웃 | 쉬움 | 토큰 만료 전까지 무효화 어려움 |
| 사용 예시 | 웹 사이트 | REST API, 모바일 앱 |
——————————————————————————
본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.
'학습일지' 카테고리의 다른 글
| [스나이퍼팩토리] 한컴AI아카데미(26.06.19) Pandas 데이터 전처리 정리 (0) | 2026.06.19 |
|---|---|
| [스나이퍼팩토리] 한컴AI아카데미(26.06.17) Pandas (0) | 2026.06.17 |
| [스나이퍼팩토리] 한컴AI아카데미(26.06.10) Fast API (1) | 2026.06.10 |
| [스나이퍼팩토리] 한컴AI아카데미(26.06.09) 네이버메일보내기자동화(Selenium) (0) | 2026.06.10 |
| [스나이퍼팩토리] 한컴AI아카데미(26.06.08) Selenium (0) | 2026.06.09 |