목표 : JWT 인증/인가 과정을 구현
그 전에 Spring Security를 알아보자
들어가기 전에
Spring Security
스프링 시큐리티는 스프링 기반의 애플리케이션 보안(인증, 인가, 권한)을 담당하는 스프링 하위 프레임워크이다.
스프링 시큐리티는 이러한 필터들을 또 다시 하나로 묶어 하나의 인증 영역을 만들고 이를 SecurityFilterChain 객체로 관리한다.
(기존에는 하나의 SecurityFilterChain을 구성하기 위해서 WebSecurityConfigurerAdapter를 상속한 클래스에서 config 메소드를 오버라이딩한다. 하지만 스프링 시큐리티 5.7.0 버전부터 WebSecurityConfigurerAdapter를 사용하지 않는다고 되어있다.)
Spring Security는 '인증'과 '권한'에 대한 부분을 Filter 흐름에 따라 처리하고 있다.
Filter는 Dispatcher Servlet으로 가기 전에 적용된다.
Client (request) → Filter → DispatcherServlet → Interceptor → Controller
Spring Security의 인증 구조
- 사용자가 입력한 사용자 정보(username,password)를 가지고 인증을 요청한다.(Request)
- AuthenticationFilter가 이를 가로채 UsernamePasswordAuthenticationToken(인증용 객체)를 생성한다
- 필터는 요청을 처리하고 AuthenticationManager의 구현체 ProviderManager에 Authentication과 UsernamePasswordAuthenticationToken을 전달한다.
- AuthenticationManager는 검증을 위해 AuthenticationProvider에게 Authentication과 UsernamePasswordAuthenticationToken을 전달한다.
- 이제 DB에 담긴 사용자 인증정보와 비교하기 위해 UserDetailsService에 사용자 정보를 넘겨준다.
- DB에서 찾은 사용자 정보인 UserDetails 객체를 만든다.
- AuthenticationProvider는 UserDetails를 넘겨받고 비교한다.
- 인증이 완료되면 권한과 사용자 정보를 담은 Authentication 객체가 반환된다.
- AuthenticationFilter까지 Authentication정보를 전달한다.
- Authentication을 SecurityContext에 저장한다.
Authentication
인증 시 id와 password를 담고 인증 검증을 위해 전달되어 사용된다.
인증 후 최종 인증 결과를 Authetication 객체에 담고 SecurityContext에 저장되어 전역적으로 참조가 가능해진다.
Authentication authentication = SecurityContextHolder.getContext().getAuthentication()
- SecurityContext → SecurityContextHolder를 통해 얻을 수 있으며, 현재 인증된 사용자의 정보(Authentication)를 포함한다
- Authentication → principal, credentials, authorities 필드를 가지며, 인증 전 상황과 인증 후 상황에 따라 사용되는 목적이 달라진다.
- 인증 전 - 인증을 요구하는 주체가 인증에 필요한 정보(로그인 아이디, 패스워드)를 제공하기 위해 사용
- principal - 로그인 시도 아이디(String)
- credentials - 로그인 시도 비밀번호(String)
- Authenticated : 인증 여부
- 인증 후 - 인증이 완료된 사용자의 정보를 저장하는데 사용
- principal - 인증이 완료된 사용자 객체(UserDetails의 구현체)
- credentials - 인증 완료후 유출 가능성을 줄이기 위해 삭제
- authorities - 인증된 사용자가 가지는 권한 목록
- Authenticated : 인증 여부
- 인증 전 - 인증을 요구하는 주체가 인증에 필요한 정보(로그인 아이디, 패스워드)를 제공하기 위해 사용
인증 후 유효 토큰이라면 Security Context Holder라는 SecurityContext 를 저장하는 객체에 담긴다.
SecurityContext 는 인증 객체가 저장되는 보관소로 인증정보가 필요할 때 언제든지 인증 객체를 꺼내 사용할 수 있다.
스레드 로컬(Thread local : 스레드마다 공간을 할당)에 저장하여 코드의 아무 곳에서나 참조할 수 있고, 다른 스레드와 공유하지 않으므로 독립적으로 사용할 수 있다.
다음 포스팅
[JWT] JWT 인증/인가 적용기(2) - Spring Security를 통한 JWT 적용
'Backend > JWT' 카테고리의 다른 글
[JWT] JWT 인증/인가 적용기(4) - AccessToken이 만료된 경우 (0) | 2024.02.28 |
---|---|
[JWT] JWT는 어디에 담아 클라이언트와 요청/응답할까 (0) | 2024.02.27 |
[JWT] JWT 인증/인가 적용기(3) - 로그인 (2) | 2024.02.27 |
[JWT] JWT 인증/인가 적용기(2) - Spring Security를 통한 JWT 적용 (0) | 2024.01.29 |
[JWT] Access Token과 Refresh Token이란? (0) | 2024.01.27 |