Home /Spring/ Spring Security, JWT
Post
Cancel

/Spring/ Spring Security, JWT



Spring Security


  • Spring 기반의 어플리케이션의 보안(인증과 권한, 인가 등)을 담당하는
    스프링 하위 프레임워크
  • ‘인증’과 ‘권한’에 대한 부분을 Filter 흐름에 따라 처리



Spring Security의 구조



  • 세션-쿠키방식으로 인증


세션에 사용자 정보를 저장한다는 것
= 전통적인 세션-쿠키 기반의 인증 방식을 사용한다는 것을 의미



스크린샷



1. 유저가 로그인을 시도하면
  사용자가 입력한 정보를 가지고 인증을 요청한다. (Request)


2. AuthenticationFilter는 이를 가로채
  UsernamePasswordAuthenticationToken(인증용 객체)를 생성한다.


3. 필터는
  요청을 처리하고
  AuthenticationManager의 구현체 ProviderManager
  Authentication과 UsernamePasswordAuthenticationToken을 전달한다.


4. AuthenticationManager는
  검증을 위해 AuthenticationProvider에게
  Authentication과 UsernamePasswordAuthenticationToken을 전달한다.


5. DB에 담긴 사용자 인증정보와 비교하기 위해
  UserDetailsService에 사용자 정보를 넘겨준다.


6. user DB로 들어가
  존재하는 유저라면
  UserDetails 로 객체를 만든다.


7. AuthenticationProvider
  UserDetails를 넘겨받고 비교한다.


8. 인증이 완료되면
  권한과 사용자 정보를 담은 Authentication정보를 전달한다.


9. 그 후 AuthenticationFilter까지 Authentication 객체가 반환된다.


10. Authentication정보는
  SecurityContextHolder 세션 영역에 있는 SecurityContext
  UsernamePasswordAuthenticationToken(Authentication) 객체를 저장하고,
  ➡️ 성공시 AuthenticationSuccessHandle를 실행   ➡️ 실패시 AuthenticationFailureHandler 실행



JWT


  • JSON 포맷을 이용해 정보를 가볍고 안전하게 전송하기 위한
    Claim 기반의 Web Token

  • 일반적으로 클라이언트와 서버, 서비스와 서비스 사이 통신 시 권한 인가(Authorization)을 위해 사용하는 토큰

  • 사용자 로그인 시 서버는 사용자 인증을 완료하고
    외부에 노출되어도 문제가 없는 인증관련 정보(사용자 ID, 권한 등)를 JSON 형태로 만든다.
    이 데이터를 base64 인코딩을 해서 문자열을 만들고,
    미리 정한 시스템의 SecretKey를 이용하여 서명 문자열을 생성한다.



JWT 구조


일반적으로 JWT의 구조는
헤더, 페이로드, 서명 세 부분을 점으로 구분된다.


HEADER.PAYLOAD.SIGNATURE

  • 헤더: 토큰 타입과 해싱 알고리즘
  • 페이로드: 실제로 전달하는 정보
  • 서명: 위변조를 방지하기 위한 값

스크린샷



JWT 발급 과정




스크린샷


스크린샷



1. 클라이언트에서
  로그인에 검증 가능한 ID, PW를 실어서 서버로 보낸다.


2. 서버는 사용자 인증이 완료될 시
  JWT토큰을 생성해서 Body에 담아 클라이언트에게 응답한다.


3. 클라이언트는
  앞으로 로그인을 제외한 다른 api를 요청할 때마다
  header에 토큰을 실어서 보낸다.


4. 서버에서는 다시 header에 실려온 토큰을 검증후 인증되면 응답을 해준다.
  (권한이 있는 사용자에게 리소스를 제공)




(참고링크)



공부한 내용을 여러글과 책 읽은 내용을 바탕으로 정리하고 있습니다.
좋은 글로 저의 공부에 도움을 주시는 분들께 감사드립니다.

This post is licensed under CC BY 4.0 by the author.