JWT (Json Web Token) 이해 기초

StrayCat·2026년 2월 16일

JWT란?

JWT(Json Web Token)는 JSON 포맷을 이용하여 사용자 정보를 안전하게 전달하기 위한 토큰 기반 인증 방식입니다.

  • Claim 기반: 토큰 자체에 사용자 정보를 담아서 전달
  • 저장 위치: 일반적으로 브라우저의 쿠키 저장소에 보관

왜 JWT를 사용할까?

세션 기반 인증의 한계

1️⃣ 서버가 1대인 경우

  • 하나의 세션이 모든 클라이언트의 로그인 정보를 관리
  • 문제없이 동작

2️⃣ 서버가 2대 이상인 경우 (확장성 문제)

대용량 트래픽 처리를 위해 서버를 늘리면 문제가 발생합니다.

Server 1: Session1 → Client1, Client2, Client3
Server 2: Session2 → Client4
Server 3: Session3 → Client5, Client6

문제 상황: Client1이 Server2에 요청하면?
→ Server2의 Session2에는 Client1의 로그인 정보가 없어서 인증 실패

세션 확장 문제 해결 방법

방법 1: Sticky Session

  • 클라이언트마다 특정 서버에 고정
  • 단점: 특정 서버에 부하 집중 가능성

방법 2: 세션 저장소 (Session Storage)

  • Redis 같은 별도의 세션 저장소를 두고 모든 세션을 중앙 관리
  • 모든 서버가 동일한 세션 정보에 접근 가능
  • 단점: 세션 저장소가 병목이 될 수 있음

방법 3: JWT 사용 ⭐

  • 로그인 정보를 서버가 아닌 클라이언트에 저장
  • 모든 서버가 동일한 Secret Key만 보유
  • Secret Key로 JWT의 암호화 및 위조 검증 수행

JWT의 장단점

✅ 장점

  1. 서버 부하 감소

    • 동시 접속자가 많을 때 세션 관리 부담 없음
    • 서버는 상태를 저장하지 않음(Stateless)
  2. 도메인 간 인증 용이

    • 클라이언트와 서버가 다른 도메인일 때 유리
    • 예: 카카오 OAuth2 로그인

❌ 단점

  1. 구현 복잡도 증가

    • 세션보다 구현이 복잡함
  2. 네트워크 비용 증가

    • JWT에 담는 정보가 많아질수록 매 요청마다 전송되는 데이터 증가
  3. 토큰 만료 관리의 어려움

    • 발급된 JWT를 서버에서 강제로 만료시킬 방법이 없음
    • 탈취 시 유효기간까지는 악용 가능
  4. 보안 위험

    • Secret Key 유출 시 JWT 조작 가능

JWT 사용 흐름

1️⃣ 로그인 및 JWT 발급

// 1. 클라이언트가 username, password로 로그인 성공
// 2. 서버에서 로그인 정보를 JWT로 암호화 (Secret Key 사용)

// JWT를 쿠키에 담아 응답
Cookie cookie = new Cookie(AUTHORIZATION_HEADER, token); // Name-Value 형태
cookie.setPath("/"); // 모든 경로에서 쿠키 접근 가능

// Response 객체에 Cookie 추가
response.addCookie(cookie);

// 3. 브라우저 쿠키 저장소에 JWT 자동 저장

2️⃣ JWT를 통한 인증

// 클라이언트가 API 요청 시 쿠키에서 JWT 추출
public String getTokenFromRequest(HttpServletRequest req) {
    Cookie[] cookies = req.getCookies();
    
    if(cookies != null) {
        for (Cookie cookie : cookies) {
            // JWT가 담긴 쿠키 찾기
            if (cookie.getName().equals(AUTHORIZATION_HEADER)) {
                try {
                    // URL 인코딩된 값을 디코딩
                    return URLDecoder.decode(cookie.getValue(), "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    return null;
                }
            }
        }
    }
    return null;
}

서버의 검증 과정:
1. JWT 위조 여부 검증 (Secret Key 사용)
2. JWT 유효기간 확인
3. 검증 성공 시 → JWT에서 사용자 정보 추출하여 사용


JWT 구조

JWT는 Header / Payload / Signature 세 부분으로 구성됩니다.

🔍 중요한 특징

  • JWT는 누구나 평문으로 복호화 가능 (디코딩)
  • 하지만 Secret Key 없이는 수정 불가능 (무결성 보장)
  • 즉, JWT는 Read-Only 데이터

1. Header (헤더)

{
  "alg": "HS256",  // 암호화 알고리즘
  "typ": "JWT"     // 토큰 타입
}

2. Payload (페이로드)

{
  "sub": "1234567890",    // Subject (주제)
  "username": "Tom",    // 사용자 정보
  "admin": true           // 권한 정보
}

실제 사용자 정보가 담기는 곳입니다.

3. Signature (서명)

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret  // Secret Key로 서명
)

Header와 Payload를 합쳐서 Secret Key로 서명한 값입니다.


실전 팁 💡

JWT 보안 강화 방법

  1. 유효기간 짧게 설정

    • Access Token: 15분~1시간
    • Refresh Token 활용하여 재발급 구조 구성
  2. 민감한 정보는 Payload에 넣지 않기

    • 비밀번호, 카드번호 등은 절대 금지
    • JWT는 누구나 디코딩 가능함을 기억할 것
  3. HTTPS 사용 필수

    • JWT가 네트워크에서 탈취되지 않도록
  4. Secret Key 관리 철저히

    • 환경변수로 관리
    • 하드코딩 금지
    • 주기적으로 변경

JWT vs Session 선택 기준

상황추천 방식
서버 확장이 필요한 경우JWT
외부 서비스와 인증 연동JWT
즉시 로그아웃 필요Session
작은 규모의 애플리케이션Session

마무리

JWT는 서버의 부담을 줄이고 확장성을 높이는 현대적인 인증 방식입니다. 하지만 보안에 주의해야 하며, 특히 Secret Key 관리유효기간 설정이 중요합니다.

세션과 JWT의 장단점을 이해하고, 프로젝트 상황에 맞는 인증 방식을 선택하는 것이 중요합니다.


참고 자료

profile
알면 좋은 것보단 잊어버리기 싫은 것들을 기록합니다.

0개의 댓글