JWT란?

마운틴 스타·2026년 3월 5일

AI

목록 보기
4/4
post-thumbnail

JWT란 무엇인가

웹 서비스를 사용하다 보면 로그인 이후에도 계속 로그인 상태가 유지되는 경험을 하게 된다.
예를 들어 쇼핑몰이나 커뮤니티에 로그인하면 페이지를 이동하거나 새로고침을 해도 다시 로그인하지 않아도 서비스를 이용할 수 있다.

하지만 HTTP 프로토콜의 특성을 생각해보면 이러한 동작은 자연스럽지 않다.

HTTP는 Stateless(무상태) 프로토콜이다.
즉, 서버는 이전 요청에 대한 정보를 기억하지 않는다.

예를 들어 다음과 같은 요청이 발생한다고 가정해보자.

1. 로그인 요청
2. 상품 조회 요청
3. 장바구니 조회 요청

HTTP 관점에서는 이 세 요청이 모두 서로 다른 요청이다.
따라서 서버는 사용자가 누구인지 기본적으로 알 수 없다.

이 문제를 해결하기 위해 등장한 것이 바로 인증(Authentication) 방식이다.

대표적인 인증 방식에는 다음과 같은 것들이 있다.

  • Session 기반 인증
  • Token 기반 인증
  • JWT 기반 인증

이 글에서는 Token 기반 인증과 JWT를 중심으로 살펴본다.


토큰 기반 인증 (Token-Based Authentication)

토큰 기반 인증이란
사용자가 로그인에 성공하면 서버가 토큰(Token) 을 발급하고
이후 요청마다 이 토큰을 함께 보내 사용자 인증을 수행하는 방식이다.

즉, 사용자가 로그인에 성공하면 서버는 다음과 같은 과정을 수행한다.

  1. 사용자 인증 성공
  2. 인증 정보를 기반으로 토큰 생성
  3. 클라이언트에게 토큰 전달

이후 클라이언트는 서버에 요청할 때마다 토큰을 함께 전송한다.
서버는 이 토큰을 검증하여 요청한 사용자가 인증된 사용자인지 확인한다.


토큰 기반 인증 동작 과정

토큰 기반 인증은 다음과 같은 흐름으로 작동한다.

1️⃣ 사용자가 아이디와 비밀번호로 로그인 요청
2️⃣ 서버가 사용자 정보를 검증
3️⃣ 검증이 성공하면 서버가 토큰 발급
4️⃣ 클라이언트는 토큰을 저장
5️⃣ 이후 요청마다 토큰을 서버에 전송
6️⃣ 서버는 토큰을 검증 후 요청 처리

보통 토큰은 HTTP 요청 헤더에 포함된다.

Authorization: Bearer <Token>

여기서 Bearer
“이 토큰을 가진 사용자가 인증된 사용자다”라는 의미로 사용된다.


토큰 기반 인증 구조

인증 흐름은 다음과 같다.

사용자 로그인

서버 토큰 생성

클라이언트 토큰 저장

요청 시 토큰 전송

서버 토큰 검증


서버 기반 인증 방식 (Session)

토큰 기반 인증 이전에는 세션(Session) 기반 인증 방식이 많이 사용되었다.

세션 기반 인증에서는 사용자가 로그인하면
서버는 세션(Session) 이라는 저장 공간에 사용자 정보를 저장한다.

세션이란
서버가 사용자 상태 정보를 일시적으로 저장해두는 서버 측 저장 공간이다.

세션은 다음과 같은 위치에 저장될 수 있다.

  • 서버 메모리 (RAM)
  • 파일 시스템
  • 데이터베이스
  • Redis 같은 메모리 기반 DB

인증 흐름은 다음과 같다.

1️⃣ 사용자가 로그인 요청
2️⃣ 서버가 세션 생성
3️⃣ 서버가 세션 ID 생성
4️⃣ 세션 ID를 쿠키에 저장
5️⃣ 요청 시 쿠키가 서버로 전달
6️⃣ 서버가 세션을 조회하여 사용자 확인

즉,

실제 사용자 정보는 서버에 저장되고
클라이언트는 세션 ID만 가지고 있게 된다.


세션 기반 인증의 문제점

세션 기반 인증은 전통적인 웹 서비스에서는 잘 동작하지만
서비스 규모가 커지면서 몇 가지 문제가 발생한다.

1. 서버 상태 관리 필요 (Stateful)

세션 방식에서는 사용자 정보를 서버에 저장해야 한다.

즉 서버는 다음과 같은 정보를 계속 유지해야 한다.

  • 로그인 사용자 정보
  • 세션 ID
  • 세션 만료 시간

사용자가 많아질수록

  • 서버 메모리 사용 증가
  • 세션 관리 비용 증가

문제가 발생한다.


2. 확장성 문제 (Scalability)

서비스 규모가 커지면 서버를 여러 대로 확장하게 된다.

하지만 세션 방식에서는 다음 문제가 생긴다.

사용자가 로그인한 서버가 A라면
이 사용자는 항상 A 서버로 요청이 가야 한다.

이를 해결하기 위해서는 다음과 같은 방법들이 필요하다.

세션 공유 서버

여러 서버가 동일한 세션 정보를 사용할 수 있도록 별도의 세션 저장 서버를 두는 방식이다.

Redis 세션 저장

메모리 기반 데이터베이스인 Redis에 세션을 저장하는 방식이다.
여러 서버가 Redis를 통해 동일한 세션 정보를 공유할 수 있다.

세션 클러스터링

여러 서버가 서로 세션 정보를 공유하도록 구성하는 방식이다.
서버 간 세션을 동기화해야 하기 때문에 시스템 구조가 복잡해질 수 있다.


토큰 기반 인증의 장점

이러한 문제를 해결하기 위해 등장한 방식이 토큰 기반 인증이다.

1. Stateless 구조

토큰 기반 인증에서는 사용자 인증 정보를 서버에 저장하지 않는다.

인증 정보가 토큰 안에 포함되어 있기 때문이다.

따라서 서버는

  • 세션 관리
  • 사용자 상태 저장

을 하지 않아도 된다.

이러한 구조를 Stateless 라고 부른다.


2. 서버 확장에 유리

토큰 기반 인증에서는 어떤 서버가 요청을 받아도 문제가 없다.

왜냐하면 사용자 인증 정보가 토큰 안에 포함되어 있기 때문이다.

서버 A
서버 B
서버 C

어느 서버로 요청이 가더라도
토큰만 검증하면 사용자 인증을 수행할 수 있다.


3. 다양한 플랫폼 지원

토큰은 HTTP Header에 포함되기 때문에 다양한 환경에서 사용하기 쉽다.

예를 들어

  • 웹 브라우저
  • 모바일 앱
  • 다른 서버
  • 외부 API

에서도 동일한 방식으로 인증을 처리할 수 있다.


JWT (JSON Web Token)

JWT는 토큰 기반 인증에서 가장 널리 사용되는 토큰 형식이다.

JWT는 JSON 객체를 기반으로 만들어진 토큰이며 다음과 같은 특징을 가진다.

  • Compact : 짧은 문자열 형태
  • Self-contained : 토큰 자체에 인증 정보 포함
  • URL-safe : HTTP 환경에서 안전하게 전송 가능

JWT의 기본 구조는 다음과 같다.

Header.Payload.Signature

각 요소는 . 으로 구분된다.


JWT 구조

JWT는 다음 3개의 요소로 구성된다.

1️⃣ Header
2️⃣ Payload
3️⃣ Signature


1. Header

Header에는 토큰 타입과 서명 알고리즘 정보가 들어간다.

예시

{
 "alg": "HS256",
 "typ": "JWT"
}
  • alg : 서명 알고리즘
  • typ : 토큰 타입

2. Payload

Payload에는 사용자 정보 데이터가 들어간다.

예시

{
 "userId": 123,
 "role": "user",
 "exp": 1716239022
}

Payload 안에 들어가는 데이터들을 Claim 이라고 부른다.

대표적인 Claim

  • userId
  • 권한(role)
  • 토큰 발급 시간
  • 토큰 만료 시간

⚠️ 중요한 점

Payload는 암호화되지 않는다.
단순히 Base64 인코딩 되어 있을 뿐이다.

따라서 누구나 토큰을 디코딩하면 Payload 내용을 확인할 수 있다.

그래서

  • 비밀번호
  • 개인정보
  • 민감한 정보

같은 데이터는 절대 포함하면 안 된다.


3. Signature

Signature는 토큰이 변조되지 않았는지 검증하는 서명이다.

서버는 다음 방식으로 Signature를 생성한다.

Signature =
HMACSHA256(
 base64UrlEncode(header) + "." +
 base64UrlEncode(payload),
 secretKey
)

만약 누군가 Payload를 수정하면 Signature 값이 달라진다.

서버는 이를 통해 토큰 위조 여부를 확인할 수 있다.


JWT 사용 시 주의점

JWT는 편리하지만 몇 가지 보안 이슈가 존재한다.

토큰 탈취

JWT가 탈취되면 만료 전까지 사용할 수 있다.

그래서 대부분의 서비스는 다음 구조를 사용한다.

Access Token

짧은 만료시간
(보통 15분 ~ 1시간)

Refresh Token

새로운 Access Token을 발급받기 위한 토큰

이 구조를 통해 보안을 강화한다.


정리

JWT는 토큰 기반 인증 방식에서 사용하는 인증 토큰 형식이다.

토큰 기반 인증은

  • 서버가 사용자 상태를 저장하지 않는 Stateless 구조
  • 확장성이 뛰어남
  • 다양한 플랫폼에서 사용 가능

이라는 특징이 있다.

이러한 이유로 JWT는

  • REST API
  • 모바일 서비스
  • 마이크로서비스

환경에서 널리 사용되고 있다.


용어 정리

Token

사용자를 식별하기 위한 데이터 문자열

Authentication : 사용자가 누구인지 확인하는 과정

Authorization : 사용자가 어떤 권한을 가지고 있는지 확인하는 과정

Claim : JWT Payload에 포함되는 사용자 정보

Stateless : 서버가 사용자 상태를 저장하지 않는 구조


참고 자료

https://velog.io/@devjade/Token-based-Authentication
https://share.google/htI0iQEodfltoM1kk

0개의 댓글