[Spring Security JWT] JWT를 이용한 인증/인가

OOSEDUS·2024년 9월 24일

스프링 시큐리티

목록 보기
4/4
post-thumbnail

https://www.youtube.com/watch?v=NPRh2v7PTZg&list=PLJkjrxxiBSFCcOjy0AAVGNtIa08VLk1EJ
"개발자유미" 님의 스프링 시큐리티 JWT 시리즈를 보고 정리한 글입니다.

이전에 스프링 시큐리티 세션 방식에 이어서 JWT를 활용한 인증/인가 처리 방법에 대해서 공부하고 정리한 글입니다.

JWT 인증 방식 시큐리티 동작 모식도

1. 회원 가입 : 세션 방식과 JWT 방식의 차이 없음

2. 로그인 (인증) : 세션 방식에서는 스프링 시큐리티가 알아서 자동으로 처리해주었는데, JWT 방식에서는 조금 더 복잡하게 설정을 해줘야한다.(ex. UsernamePasswordAuthenticationFilter)

  • 로그인이 성공되었을 때 JWTUtill에서 토큰을 생성하여 응답한다.

3. 경로 접근(인가) : 로그인 후에 발급받은 토큰을 헤더에 넣은채로 특정 경로에 요청이 오면, JWT Filter를 통해 검증한 후 일시적 요청에 대한 세션을 생성한다. (세션은 요청 종료 후 소멸됨)


JWT 로그인 동작 원리

  • UsernamePasswordAuthenticationFilter : 요청 아이디와 비밀번호를 꺼내어 로그인을 진행한다고 AuthenticationManager 한테 넘겨준다. 그러면 DB로부터 회원정보를 가져와서 일치하는지 검증을 시도한다.
  • 검증이 확인이 되면, SuccessfulAuthentication 이 동작을 한다. 이때 JWT를 생성하여 사용자에게 응답을 한다.

스프링 시큐리티 필터 동작 원리

스프링 시큐리티는 클라이언트의 요청이 여러개의 필터를 거쳐 DispatcherServlet(Controller)으로 향하는 중간 필터에서 요청을 가로챈 후 검증(인증/인가)을 진행한다.

Delegating Filter Proxy
서블릿 컨테이너 (톰캣)에 존재하는 필터 체인에 DelegatingFilter를 등록한 뒤 모든 요청을 가로챈다. 가로챈 요청은 SecurityFilterChain에서 처리 후 상황에 따른 거부, 리디렉션, 서블릿으로 요청 전달을 진행한다.

SecurityFilterChain의 필터 목록과 순서
모든 필터가 활성화 되는 것은 아니다.


JWT 발급과 검증

  • 로그인시 → 성공 → JWT 발급
  • 접근시 → JWT 검증

JWT에 관해 발급과 검증을 담당할 클래스가 필요하다. 따라서 JWTUtil이라는 클래스를 생성하여 JWT 발급, 검증 메소드를 작성한다.


JWT 생성 원리

JWT 구조 : Header.Payload.Signature 구조로 이루어져 있다.

  • Header : JWT임을 명시, 사용된 암호화 알고리즘 종류
  • Payload : 사용자가 넣은 정보(ex. username, 발급 일자 등)
  • Signature : 암호화 알고리즘

JWT의 특징은 내부 정보를 단순 BASE64 방식으로 인코딩하기 때문에 외부에서 쉽게 디코딩 할 수 있다.외부에서 열람해도 되는 정보를 담아야하며, 토큰 자체의 발급처를 확인하기 위해서 사용한다.
즉, 토큰 내부에 비밀번호와 같은 값 입력 금지


암호화 키 저장
암호화 키는 하드코딩 방식으로 구현 내부에 탑재하는 것을 지양하기 때문에 변수 설정 파일(ex. application.properties)에 저장한다.

profile
성장 가능성 만땅 개발블로그

0개의 댓글