백엔드/Spring Security

[Spring Security] JWT와 Spring Security의 차이점은?

연유뿌린빙수 2025. 2. 22. 15:31

처음에는 JWT와 Spring Security가 동일한 개념인 줄 알고 무턱대고 사용하려고 했다가,

서로 다른 개념이라는 것을 알고 공부한 경험이 있다.

 

이에 대한 차이를 확실하게 구분하고 기록해두자.

 

 

JWT(JSON Web Token)이란?

: 사용자 인증 및 식별에 사용되는 토큰이다.

클라이언트가 인증 정보를 포함해 서버와 통신할 때 사용되는데, 다양한 언어로도 지원이 되기 때문에(Java, JS, Python 등) 일반적으로 가장 많이 사용되는 토큰이다.

 

구성은 다음과 같다.

  • Header: 어떤 암호화 알고리즘인지, JWT token 기록
{ 
 "typ": "JWT",
 "alg": "HS256"
}
  • Payload: 사용자의 이름, 사용자의 정보, 토큰 만료 시간 등 사용자 식별 가능에 대한 정보가 저장됨, JWT 토큰만 갖고 있다면 누구나 다 접근이 가능하므로, 비밀번호와 같은 주요 정보가 담겨서는 안 됨
{
    "iss": "https://accounts.google.com",
    "azp": "1234987819200.apps.googleusercontent.com",
    "aud": "1234987819200.apps.googleusercontent.com",
    "sub": "10769150350006150715113082367",
    "at_hash": "HK6E_P6Dh8Y93mRNtsDB1Q",
    "email": "jsmith@example.com",
    "email_verified": "true",
    "iat": 1353601026,
    "exp": 1353604926,
    "nonce": "0394852-3190485-2490358",
    "hd": "example.com"
}
  • Signature: JSON 페이로드의 무결성을 검증하는 데 사용할 수 있도록 암호화 알고리즘을 통해 생성된 문자열임, 토큰의 유효성에 대한 정보들이 담겨있음
Base64URLSafe(
    HMACSHA256("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJhYmNkMTIzIiwiZXhwaXJ5IjoxNjQ2NjM1NjExMzAxfQ", "NTNv7j0TuYARvmNMmWXo6fKvM4o6nv/aUi9ryX38ZH+L1bkrnD1ObOQ8JAUmHCBq7Iy7otZcyAagBLHVKvvYaIpmMuxmARQ97jUVG16Jkpkp1wXOPsrF9zwew6TpczyHkHgX5EuLg2MeBuiT/qJACs1J0apruOOJCg/gOtkjB4c=")
)

Results in:
3Thp81rDFrKXr3WrY1MyMnNK8kKoZBX9lg-JwFznR-M

 

-> 이 세 가지 것들이 합쳐져 . 으로 구분되는 것이 JWT이다.

그림으로 나타내자면 다음과 같다.

이미지 출처: https://supertokens.com/blog/what-is-jwt

 

 

Spring Security란?

Spring Security는 Spring 프레임워크에서 제공하는 보안(Secure)관리 라이브러리로, 필터를 통하여 인증(Authentication), 권한 부여(Authorization), CSRF 방어, 세션 관리 등을 관리하는 기능을 제공해준다.

 

클라이언트와 서버의 요청을 그림으로 나타내면 다음과 같다.

위의 필터에 대한 설정을 Spring Security에서 설정이 가능하다.

필터 기반으로 HTTP 요청을 검사 및 처리해준다.

 

 

JWT와 Spring Security의 차이점은?

JWT

JWT는 Stateless(무상태) 인증으로, 클라이언트와 서버가 요청/응답이 끝나면 서버 측에서 클라이언트에 대한 모든 정보를 지워버린다. 그렇기 때문에 Cookie에 이미 접속한 기록이 있는 클라이언트가 토큰에 대한 정보를 담아서 인증을 거친다.

 

JWT에서 유효성 검증의 방법이 쉽기 때문에 편리하나, 탈취의 위험이 높기에 보안 측면에서 좋지 못하다.

 

JWT 인증 흐름

  1. 클라이언트가 아이디/비밀번호를 입력하여 로그인 요청
  2. 서버에서 사용자 정보 검증 후 JWT를 발급
  3. 클라이언트는 요청 시 JWT를 Authorization: Bearer <token> 헤더에 포함하여 전송
  4. 서버에서 JWT의 유효성을 검증하고 해당 사용자의 요청을 처리(Stateless로 유효성 검증만 하면 됨)

 

 

Spring Security

기본적으로 세션 기반 인증이나, Spring Security 같은 경우는 JWT 토큰을 사용가능하며 통합이 가능하기에 별개의 개념이 아니다!

보안이 좋다는 장점이 존재하는 세션은,

서버에서 저장을 해야하기 때문에 DB나 서버의 부담이 존재한다는 단점이 있다.(성능 저하의 요인이 될 수 있음)

 

Spring Security 인증 흐름

  1. 클라이언트가 아이디/비밀번호를 입력하여 로그인 요청
  2. Spring Security에서 인증(Authentication)을 처리하고 세션(Session) 생성(기본적으로 세션 기반)
  3. 이후 요청에서 세션을 확인하여 인증된 사용자 여부를 결정
  4. 인증된 사용자의 요청만 처리

 

JWT + Spring Security 통합

Spring Security의 세션 사용시 서버 부담의 문제로 인해, 서버에 세션을 사용하지 않고 JWT 토큰을 필터체인에 적용하며, CSRF, XSS 보호 등 다양한 보안 기능을 적절히 섞어 이용하는 경우가 많다!

 

Spring Security에서 JWT를 사용하려면 JWT 필터를 추가하여 Authorization 헤더에서 토큰을 추출하고 검증하는 방식으로 연동할 수 있다.(JWTAuthenticationFilter, SecurityConfig 설정 필요)