학습일지

[스나이퍼팩토리] 한컴AI아카데미(26.06.11) JWT 기반 인증

cd-record 2026. 6. 11. 18:00

 

JWT

1. 인증(Authentication)

인증은 시스템이나 서비스가 사용자가 누구인지 확인하는 과정

 

FastAPI에서의 인증 방식

  • 세션 기반: Depends와 같은 의존성 주입을 통해 쉽게 구현 가능, 쿠키 기반의 세션 관리를 사용
  • 토큰 기반: Bearer토큰(와)과 같은 인증 스키마를 사용해 JWT 기반 인증을 구현 일반적

2. JWT이란?

JWT는 주로 인증 목적으로 사용되며, 토큰 안에 사용자의 인증 정보를 포함하고 있어 서버가 별도로 상태를 유지할 필요가 없습니다.

JWT의 구조

  • Header(헤더): 토큰의 타입(JWT)과 서명 생성에 사용된 암호화 알고리즘(예: HS256) 정보가 담깁니다.
  • Payload(페이로드): 토큰에 담을 실제 정보(사용자 식별 ID, 권한, 토큰 만료 시간 등)가 Key-Value 형태의 '클레임(Claim)'으로 포함됩니다.
  • Signature(서명): 헤더와 페이로드를 서버가 가지고 있는 비밀키(Secret Key)로 암호화한 값입니다. 이를 통해 토큰의 위변조 여부를 검증합니다.

JWT 인증 동작 방식

  1. 사용자가 아이디와 비밀번호로 로그인을 요청합니다.
  2. 서버는 검증 후 , 사용자 정보와 비밀키를 이용해 JWT 토큰을 발급하여 클라이언트에게 전달합니다.
  3. 클라이언트는 이 토큰을 저장하고, 서버에 요청을 보낼 때마다 HTTP 헤더(Authorization)에 토큰을 포함시켜 보냅니다.
  4. 서버는 토큰의 서명(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) 리뷰로 작성 되었습니다.