[Spring Security] Spring Security를 통한 JWT 로그인 - 1. Spring Security의 동작 원리 이해

Dawon Seo·2022년 10월 27일
1
post-thumbnail

스프링 시큐리티 너어무 어렵다...
꼭 제대로 이해하고 만다!!!


웹 개발에서 절대로 빠질 수 없는 요소 중 하나인 로그인 관리!
보안에 직결되는 문제인 만큼 주의를 기울여야 합니다.

인증과 인가!

  • 인증(Authentication): 특정 서비스에 일정 권한이 주어진 사용자임을 아이디와 패스워드를 통해 인증받는 것
  • 인가(Authorization): 한번 인증을 받은 사용자가 이후 서비스의 여러 기능을 사용할 때 허가를 받아 로그인이 유지되는 것

이러한 인증과 인가를 어떻게 하느냐가 로그인 정보 관리의 큰 고민 이슈이지요.

그런데 HTTP는 Stateless(비상태성)한 특성을 가지고 있습니다.
Stateless하다는 것은 서버로 가는 모든 요청이 이전 리퀘스트와 독립적, 즉 요청끼리 연결이 없다는 것을 의미합니다. 이전 요청과 다음 요청의 맥락이 이어지지 않는다는 것이에요.
때문에 HTTP는 사용자의 로그인 정보를 기억하지 못하죠. 하지만 페이지를 이동할 때마다 다시 로그인을 해야 한다면 매우 불편할 것입니다. ( ˘-˘)
이를 해결하기 위해, 로그인 정보를 확인하는 데에 쓰이는 대표적인 두 가지가 바로 세션(Session)과 토큰(Token)입니다.

스프링 기반 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크인 스프링 시큐리티 (Spring security)JWT 기반 로그인을 구현해 보고, 이해해 봅시다...! (제발!)
가장 먼저, 스프링 시큐리티의 동작 원리를 먼저 이해해 보도록 해요.

스프링 시큐리티의 동작 원리

  1. Http Reqeust가 서버로 넘어오면, AuthenticationFilter가 요청을 낚아챈다.
  2. AuthenticationFilter에서 Request의 Username, password를 이용하여 UsernamePasswordAuthenticationToken을 생성한다.
  3. 토큰을 AuthenticationManager가 받는다.
  4. AuthenticationManager는 토큰을 AuthenticationProvider에게 넘긴다.
  5. AuthenticationProviderUserDetailsService로 토큰의 username을 전달한다.
  6. UserDetailsService는 DB에서 회원 정보를 조회하여 UserDetails라는 객체로 반환한다.
  7. AuthenticationProvider는 반환받은 USerDetails 객체와 실제 사용자의 입력 정보를 비교한다.
  8. 비교가 완료되면 사용자 정보를 가진 Authentication 객체를 SecurityContextHolder에 담은 후 AuthenticationSuccessHandle를 실행한다. (실패 시 AuthenticationFailureHandler를 실행한다.)

0개의 댓글