본문 바로가기
system_fundamentals/security_cryptography

세션 vs JWT

by 죄니안죄니 2026. 5. 18.
반응형
 
세션 vs JWT세션 vs JWT세션 vs JWT
 
 

세션(Session)과 JWT(JSON Web Token)는 둘 다:

"로그인 상태를 유지하는 방법"
 

이다.

하지만 핵심 구조가 완전히 다르다.


가장 핵심 차이 한 줄

방식 로그인 상태 저장 위치
Session 서버
JWT 클라이언트(Token 내부)

1. Session 방식 - 전통적인 서버 로그인 방식

흐름

로그인 성공 = 서버가  SESSION_ID 생성:

# SESSION_ID 생성
JSESSIONID=ABCD1234
 

 

서버 메모리/Redis 저장

SESSION_ID: ABCD1234
{ 
	userId=hoon,
    role=ADMIN
}
 

저장 후 브라우저에 세션 ID 전달

브라우저는 쿠키만 보관 (JSESSIONID외의 정보는 브라우저가 모름)

 
Set-Cookie: JSESSIONID=ABCD1234
 

이후 요청마다 브라우저가 자동으로 이 쿠키를 전송하면

서버가 세션ID를 조회해서 매칭되는 userId, role을 찾음:

SESSION_ID 조회
 

후 로그인 사용자 확인.


즉 핵심

상태(State)를 서버가 저장
 

한다.

그래서:

Stateful
 

이라고 부름.


Session 장점

1. 강제 로그아웃 쉬움

서버에서 세션 삭제하면 끝.

2. 토큰 탈취 대응 쉬움

세션 무효화 가능.

3. 구현 단순

Spring Security 기본 구조.


단점

서버 메모리 사용

사용자 많으면 부담.

서버 확장 어려움

서버 여러 대면:

  • 세션 공유
  • Redis
  • Sticky Session
  • Session Cluster

필요.


2. JWT 방식

JWT는 구조가 다르다.


핵심

사용자 정보 자체를
토큰 안에 넣는다
 

로그인 성공 시

서버가 JWT 생성.

예:

HEADER.PAYLOAD.SIGNATURE
 
{
  "userId":"hoon",
  "role":"ADMIN",
  "exp":999999999
}
 

서버는 전자서명

서버비밀키(HMAC 또는 RSA/ECDSA)로 서명. 위조 불가

클라이언트(브라우저) 저장

보통:

  • 쿠키
  • LocalStorage

등에 저장.

이후 요청 시

 
Authorization: Bearer eyJ...
 

전송.

서버는 DB 조회 안 해도 됨, 서명 검증만하고 신뢰

왜냐면:

# JWT 내부 본원하면 토큰 안에 정보 이미 존재
{
  "userId":"hoon",
  "role":"ADMIN",
  "exp":999999999
}
 

하기 때문.

서버는 서명만 검증. 세션 없고, DB조회도 필요없음

위조 안 됐나?
 

확인.


즉 핵심

상태를 서버가 저장 안 함
 

그래서:

Stateless
 

방식.


JWT 장점

1. 서버 확장 쉬움

서버끼리 세션 공유 불필요.

2. 모바일/API 친화적

SPA, 앱에 적합.

3. MSA 구조에 좋음

마이크로서비스에서 많이 사용.


JWT 단점 (엄청 중요)

1. 강제 로그아웃 어려움

JWT는 이미 사용자 손에 있음.

즉:

서버가 즉시 회수 어려움
 

2. 탈취 시 위험

유효기간 동안 사용 가능.

3. Payload 노출 가능

암호화가 아니라 Base64 인코딩.

즉:

내용 읽기는 가능
 

(서명으로 위조만 방지)

그래서 민감정보 넣으면 안 됨

예:

  • 비밀번호
  • 주민번호

절대 금지.


실무에서 많이 쓰는 구조

현재는 보통:

Access Token (짧게) 강제 로그아웃이 어려우니까 애초에 짧게
+
Refresh Token (길게) 별도로 관리
 

구조.


Access Token

  • 15분~1시간
  • API 인증용

Refresh Token

  • 재발급용
  • DB/Redis 저장

JWT라고 DB 조회가 완전히 없는 건 아님

실무에선:

  • 블랙리스트
  • Refresh 관리
  • 권한 변경
  • 강제로그아웃위해서

때문에 Redis 자주 사용. 


그래서 현실은

완전 Stateless는 드물다
 

오히려 세션이 더 좋은 경우

특히:

  • 관리자 페이지
  • 기업 내부 시스템
  • 보안 중요한 서비스

는 세션 엄청 많음.


상황 추천
전통 서버 렌더링 세션
SPA/모바일 API JWT
대규모 분산 JWT
강한 로그인 통제 세션
간단한 운영 세션
MSA/API Gateway JWT

 


Session vs JWT 비교

항목 Session JWT
상태 저장 서버 클라이언트
서버 메모리 사용 적음
서버 확장 어려움 쉬움
강제 로그아웃 쉬움 어려움
토큰 크기 작음
모바일/API 상대적으로 불편 적합

Spring 실무 느낌


Session 기반

JSESSIONID 쿠키
 

JWT 기반

 
Authorization: Bearer TOKEN
  • Authorization → 인증 헤더 이름
  • Bearer → 인증 방식 종류. "소지자", "이 토큰을 가진 사람은 인증된 것으로 간주" 라는 개념 
  • eyJhbGciOi... → 실제 토큰

Bearer Token: 토큰 자체가 신분증 역할 하는 방식

HTTP Authorization 헤더 구조

원래 HTTP 스펙 자체가 이렇게 되어 있음 (프로토콜 규약):

 
Authorization: <인증방식> <인증값>

그래서 Bearer는 JWT 전용이 아니다

이게 중요.

JWT가 없어도 Bearer 쓸 수 있음. 물론 실무에서는 JWT와 Bearer 조합을 많이 씀 JWT는 토큰 형식, 포맷이고 Bearer는 인증방식 

실무 서버 코드 예시

Spring Security 필터에서 보통:

 
String auth = request.getHeader("Authorization");
 

꺼낸 뒤:

 
if (auth.startsWith("Bearer ")) {
    token = auth.substring(7);
}
 

이렇게 파싱함.


Bearer 방식의 보안 특징

Bearer는:

가진 놈이 인증됨
 

구조라서,

토큰 탈취되면 위험함.

그래서 반드시:

  • HTTPS 사용
  • 짧은 만료시간
  • Refresh Token
  • Secure Cookie

등 같이 사용함.


요즘 트렌드

환경 주류
전통 MVC Session
SPA + API JWT
MSA JWT/OAuth2
내부 관리툴 Session 많음

실무에서 중요한 보안 포인트

JWT 저장 위치 중요

LocalStorage는:

XSS 위험
 

있다.


그래서 최근은

HttpOnly Secure Cookie
 

많이 사용.


Session도 결국 쿠키 기반

헷갈리는 부분.

Session 자체는 서버 저장이고:

세션ID 전달은 쿠키
 

사용한다.


핵심 한 줄

Session은:

로그인 상태를 서버가 저장하는 방식

브라우저:
"나 A1B2C3 입니다"

서버:
"조회해보니 ADMIN 이군"
 

이고,

JWT는:

로그인 정보를 서명된 토큰 안에 담아
클라이언트가 직접 들고 다니는 방식

브라우저:
"내 신분증 안에 ADMIN 써있음"

서버:
"서명 검증 완료. 진짜 맞네"
 

이다.

반응형

'system_fundamentals > security_cryptography' 카테고리의 다른 글

OAuth2 흐름  (0) 2026.05.18
JWT는 암호화가 아니다  (0) 2026.05.18
HTTPS 인증서는 웹사이트의 안전을 보장하는가  (0) 2026.05.15
HTTP vs HTTPS 실제 차이  (0) 2026.05.15
HTTPS 성능 비용  (0) 2026.05.15

댓글