Spring Security + JWT

이은수·2023년 6월 5일

JWT

  • JWT는 RFC 7519 웹 표준으로 지정됨.
  • JSON 객체를 사용해서 토큰 자체에 정보들을 저장하고 있는 Web Token 이라고 정의할 수 있다.
  • Header, Payload, Signature 3개의 부분으로 구성됨.
    • Header: Signature를 해싱하기 위한 알고리즘 정보들이 담겨있음.
    • Payload: 서버와 클라이언트가 주고받는 시스템에서 실제로 사용될 정보에 대한 내용들을 담고있음
    • Signature: 토큰의 유효성 검증을 위한 문자열이다. 이 문자열을 통해 서버에서는 이 토큰이 유요한 토큰인지를 검증할 수 있음.

장점

  • 중앙의 인증서버, 데이터 스토어에 대한 의존성 없음, 시스템 수평 확장 유리.
  • Base64 URL Safe Encoding > URL, Cookie, Header 모두 사용 가능한 범용성을 가짐.

단점

  • Payload에 저장할 정보가 많아지면 트래픽의 크기가 커져서 데이터 설계 고려 필요.
  • 토큰이 클라이언트에 저장돼서 서버에서 클라이언트의 토큰을 조작할 수 없음.

@EnableWebSecurity: 기본적인 Web 보안을 활성화 하겠다는 의미
추가 설정을 위해서 WebSecurityConfigurer를 implements 하거나 WebSecurityConfigurerAdapter를 extends하는 방법이 있다.
WebSecurityConfigurerAdapter를 extends하는 방법 사용함.
WebSecurityConfigurerAdapter를의 configurr 메소드를 오버라이드

InitializingBean을 implements해서 afterPropertiesSet을 @Override한 이유는 빈이 생성이 되고 주입 받은 시크릿 값을 base64 decode해서 key 변수에 할당.

Authentication객체의 권한정보를 이용해서 토큰을 생성하는 createToken 메소드 추가.

Token에 담겨있는 정보를 이용해 Authentication 객체를 리턴하는 메소드 생성
토큰을 파라미터로 받아서 토큰을 이용해서 클레임을 만들고 클레임에서 권한 정보를 빼내서 권한정보를 이용해서 유저객체 생성 유저객체, 토큰, 권한정보를 이용해서 Authentication 리턴.

토큰을 파라미터로 받아서 토큰의 유효성 검증을 수행하는 validateToken 생성. 토큰을 파싱해보고 나오는 인셉션 캐치하고 문제있으면 false 없으면 true.

JWT를 위한 커스텀 필터를 만들기 위해 JwtFilter 클래스 생성. GenericFilterBean를 extends해서 doFilter 오버라이드, 실제 필터링 로직은 doFilter 안에 들어감. doFilter 메소드의 역할은 Jwt 토큰에 인증정보를 현재 실행중인 시큐리티 컨텍스트에 저장하는 역할 수행. 필터링을 위해 리절브토큰 메소드 추가 리퀘스트 헤더에서 토큰 정보를 꺼내옴.

TokenProvider, JwtFilter를 적용할때 사용할 JwtSecurityConfig 클래스 추가.

0개의 댓글