[본캠프] Session -> JWT

윤영범·2026년 4월 28일

백오피스 과제중 관리자 인증과 CRUD 를 전부 구현한후 다른조원들이 작업하는동안 시간이 남아
Session 기반에 인증과정에서 JWT 기반의 인증 넘어가는걸 직접 살펴봤다

Session 방식

  • 서버(HttpSession)에 LoginAdmin 저장
  • 클라이언트는 JSESSIONID 쿠키 보관
  • 요청마다 Session 조회
  • @SessionAttribute로 사용자 확인

서버가 로그인상태를 직접관리하기때문에 구현이 쉬운 장점이있었지만, 그만큼 유저가 늘어날수록 메모리 사용량이 늘어나면서 서버확장성이 낮아지는 단점을 가지고있었다

JWT 방식

  • 서버는 로그인 상태를 저장하지않고 토큰검증만 수행한다
  • 클라이언트가 토크을 저장한다
  • 요청시 Authorization Header에 토큰을 포함에 전송시켜 검증받는다

JwtProvider 구현 (토큰 생성)

Payload 구성

  • sub → adminId (토큰의주인)
  • email → 사용자 이메일
  • role → 관리자 권한
  • iat → 발급 시간
  • exp → 만료 시간
  • signWith → 위조방지 서명

JWT Filter의 역할

필터는 Controller에 요청이 도착하기 전에 먼저 실행되는 컴포넌트다
필터에서 처리되는 작업들

  • 인증 검사
  • 로그 기록
  • 인코딩 처리
  • CORS 처리
  • JWT 토큰 검증

JWT Filter의 흐름

요청 들어옴
→ Authorization 헤더 확인
→ Bearer 토큰 추출
→ 토큰 유효성 검증
→ 토큰에서 사용자 정보 추출
→ Authentication 객체 생성
→ SecurityContext에 저장
→ 다음 필터 또는 Controller로 이동

여기서 중요한 점은 필터가 직접 컨트롤러를 실행하는 것이 아니라, 인증 정보를 만들어 Spring Security가 사용할 수 있도록 등록한다는 것이다

SecurityContext = 현재 요청의 인증정보를 저장하는 공간
요청이 들어올때마다 필터가 토큰을 검증하고, 그 결과를 SecurityContext에 저장한다

세션 방식:
서버 Session에 사용자 저장

JWT 방식:
매 요청마다 토큰 검증 후 SecurityContext에 사용자 저장

Authentication

Authentication은 Spring Security가 이해하는 인증된 사용자 정보 객체다

JWT 필터에서는 보통 Security에서 제공되는

UsernamePasswordAuthenticationToken 객체를 사용한다

값의미
principal로그인 사용자 정보(loginAdmin)
credentials비밀번호 같은 인증 수단( 이미토큰검증을 했기때문에 null)
authorities권한 목록 (SUPER_ADMIN)

Spring Security

필터가 이 사용자가 누군지 인증을했다면
security는 사용자가 API에 접근할 권한이 있는지 확인한다

JWT Filter = 인증(Authentication)
Spring Security = 인가(Authorization)

1. JWT 필터를 Spring Security 필터 체인에 등록
2. 어떤 URL은 공개할지 설정
3. 어떤 URL은 로그인 필요하게 할지 설정
4. 어떤 URL은 특정 ROLE만 가능하게 할지 설정
5. 세션을 사용하지 않는 Stateless 구조로 설정

SecurityConfig

SecurityConfig는 Spring Security의 보안 규칙을 설정하는 클래스다
내가 사용하는 JWT 방식에서는 기본 클래스 기능을 사용하지 않기에 전부 비활성화했다

설정의미JWT에서 비활성화하는 이유
csrf세션/쿠키 기반 공격 방어JWT는 Authorization 헤더 사용
formLoginSpring 기본 로그인 페이지REST API에서는 사용하지 않음
httpBasicID/PW 기반 기본 인증JWT Bearer 토큰 사용

최종 정리

JwtProvider
→ 토큰 생성 / 검증 / Claims 추출

JwtAuthenticationFilter
→ 요청마다 토큰 확인
→ 인증 객체 생성
→ SecurityContext 저장

SecurityConfig
→ 어떤 API를 열고 막을지 설정
→ 어떤 Role이 접근 가능한지 설정

로그인 성공
→ JWT 발급
→ 클라이언트가 토큰 저장
→ 요청 시 Authorization 헤더에 토큰 전달
→ JWT Filter가 토큰 검증
→ SecurityContext에 인증 정보 저장
→ Spring Security가 권한 확인
→ Controller 실행

오늘의 회고

JWT , 필터 , security에 내부클래스들이 많아서 그 기능을 어느정도 알아보는데 정말헷갈렸다
거기다가 쓰는 방법도 정말다양하고 인터넷에 검색했을때 옛버전으로 작업했던 부분이 많아서 찾아보는게 정말 헷갈렸다 그러면서 session 기반에 단순한 보안구조와 JWT 의 여러역활이 분리된 보안구조를 보면서 확실히 각각이 장점을 느낀거같다
보안 설계구조를 이해하는 경험이 머리가 아팠지만 재밌게 공부했던거같다

0개의 댓글