JWT
JWT(JSON Web Token) 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미함
JWT 기반 인증은 JWT 토큰(Access Token)dmf HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식임
사용자 로그인 이후 서버가 아닌 클라이언트에 인증 관련 토큰을 발급하고
이를 똥해 추가 인증을 처리함
인증 방식의 변화: 세션 기반 인증 vs 토큰 기반 인증
세션 기반 인증
- 세션 기반 인증은 사용자가 로그인하면 서버가 세션 ID를 생성하고 이를 클라이언트(주로 쿠키)에 저장
- 이후 클라이언트는 서버에 요청할 때마다 세션 ID를 함께 보내고
서버는 해당 세션 ID를 통해 로그인 상태를 확인합니다. - 문제점:
- 서버 부담: 로그인한 사용자가 많아질수록 서버 메모리에 세션 정보를 저장해야 하므로 부하가 증가
- 확장성(Scalability) 한계: 세션 데이터는 특정 서버에 저장되기 때문에 여러 서버로 분산 처리하는
환경에서 동기화 문제가 발생할 수 있음
토큰 기반 인증 (JWT 기반 인증)
- JWT 기반 인증은 서버가 사용자를 인증한 후 클라이언트에 토큰을 발급하는 방식
- 이후 클라이언트가 서버에 요청 시 해당 토큰을 Authorization 헤더에 포함하여 전송
서버는 토큰에 포함된 정보만을 바탕으로 사용자를 인증 - 장점:
- Stateless (상태 비저장): 서버가 별도의 세션 저장소를 유지할 필요가 없음
- 확장성 우수: 분산 환경에서 서버 확장이 용이
- 다양한 플랫폼 간 인증: SPA(Single Page Application) 또는 모바일-웹 간 인증에 적합\
JWT의 구조와 구성 요소
JWT는 총 Header, Payload, Signature의 3가지로 구성
각 구성 요소는 Base64로 인코딩된 문자열 형태로 .(점)으로 구분
base64 : https://namu.wiki/w/BASE64
1) Header (헤더)
- JWT 헤더는 토큰의 타입과 사용된 서명 알고리즘을 정의
- 일반적으로 JWT 타입(typ)과 해싱 알고리즘(alg)이 포함됨
# JWT 설정
# 기본값 설정
SECRET_KEY = os.getenv("SECRET_KEY", "your-secret-key")
ALGORITHM = "HS256"
2) Payload (페이로드)
- Payload는 사용자의 정보(클레임, Claim)를 담는 부분으로 인증에 필요한 정보와
기타 데이터가 JSON 형식으로 포함됨 - 클레임(Claim): JWT에서 사용자의 정보를 표현하는 데이터 단위
- 등록된 클레임 (Registered Claims): JWT 표준에서 권장하는 클레임
- 예: iss(발급자), sub(주제), exp(만료 시간), iat(발급 시간)
- 공개 클레임 (Public Claims): 누구나 읽을 수 있는 클레임. (예: 사용자 이름, 이메일 등)
- 비공개 클레임 (Private Claims): 서비스에서 정의한 커스텀 클레임. (예: 사용자의 권한 정보 등)
- 등록된 클레임 (Registered Claims): JWT 표준에서 권장하는 클레임
3) Signature (서명)
- Signature는 JWT의 변조 여부를 확인하는 부분
- Header + Payload의 조합을 비밀 키와 함께 서명(해싱)하여 생성
- JWT의 Signature는 아래와 같은 방식으로 생성됩니다
이를 통해 토큰이 중간에 변경되었는지(위변조 방지)를 확인할 수 있음
def create_access_token(user_id: int, email: str, expires_delta: timedelta = None):
to_encode = {"sub": email, "id": user_id}
expire = datetime.utcnow() + (expires_delta if expires_delta else timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES))
to_encode.update({"exp": expire})
print(f"JWT 생성 - Payload: {to_encode}") # 디버깅 로그 추가
return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
JWT 발급 시나리오
- 사용자가 로그인 시 사용자 정보를 전송
- 서버에서 사용자 인증 후 JWT 발급
- 클라이언트는 이 JWT를 저장하고 이후 요청 시 헤더에 JWT를 포함해 전송
- 서버는 JWT의 Signature를 검증하여 유효한 사용자인지 확인
'기타 > study' 카테고리의 다른 글
Spring Boot + React CORS 연동 (로컬 환경) (0) | 2025.04.13 |
---|---|
코딩 기초 트레이닝 - 프로그래머스(차근차근 시작해 보세요 Day 25) (0) | 2025.01.31 |
코딩 기초 트레이닝 - 프로그래머스(차근차근 시작해 보세요 Day 24) (0) | 2025.01.24 |
코딩 기초 트레이닝 - 프로그래머스(차근차근 시작해 보세요 Day 23) (0) | 2025.01.23 |
코딩 기초 트레이닝 - 프로그래머스(차근차근 시작해 보세요 Day 22) (1) | 2025.01.22 |