[Spring] 스프링부트 Security 강의 정리

·2024년 9월 27일

JWT란? (Json Web Token)

  • 헤더 : 어떤 알고리즘을 사용해서 서명했는지에 대한 내용
  • 페이로드 : 정보들 담기
  • 서명 : 헤더, 페이로드 데이터를 암호화

JwtAuthenticationFilter

=> 인증을 수행하는 필터

  • /login 에서 동작함 (원하는 대로 로그인 api를 변경할 수 있음)

  • 진행 순서

  1. 클라이언트로부터 username, password를 받는다.
  2. 파싱 후 LoginReqDto로 반환하고 강제로 로그인해 인증용 토큰을 생성한다.
  3. UserDetailsService의 loadUserByUsername을 호출한다.
  4. 호출 후 로그인이 성공하면 LoginUser 객체 생성 후 시큐리티 세션(SecurityContext) 에 담는다. 로그인이 실패하면 실패 에러를 날린다.
    (우리가 JWT를 쓴다 하더라도, 컨트롤러 진입을 하면 시큐리티의 권한체크, 인증체크 도움을 받을 수 있으므로 임시 세션을 만든다.)
  5. JWT 토큰을 생성하고 response 헤더에 JWT 토큰을 담아 브라우저에게 응답한다.

브라우저는 JWT 토큰 만료 시간 전까지 계속 헤더에 JWT 토큰을 담고 있고, 권한이 필요한 페이지에서 JwtAuthorizationFilter 를 호출해 사용한다.

JwtAuthorizationFilter

=> 인가를 수행하는 필터

  • 권한이 필요한 모든 주소에서 동작함

  • 진행 순서

  1. 헤더에 든 JWT 토큰을 가져와 검증한다.
  2. 검증이 성공하면 Authentication(LoginUser) 객체를 생성 하고 강제 로그인을 진행해 스프링 시큐리티의 SecutiryContext에 담는다.
  3. 이때 이 객체는 인증이 완료되었는지랑 권한 체크용으로만 사용한다.
  4. 검증이 완료되면 체인을 타고 계속 진행한다.

위 필터들을 SecutiryConfig에 등록해줘야 한다.

토큰 생성 로직은 JwtProcess 클래스에 있음. 검증 로직도 포함! JwtVO 인터페이스엔 JWT의 SECRET key와 환경 변수가 있음.

bank의 test 디렉토리에 jwt 테스트들이 있으니 나중에 참고하기.

profile
꾸준히 성장하자!

0개의 댓글