인증과 인가 등의 보안 기능을 추가하기 위해 스프링 시큐리티를 사용해보겠다.
인증
사용자가 누구인지 확인하는 단계
로그인 - 데이터베이스에 등록된 아이디와 패스워드를 사용자가 입력한 아이디와 비밀번호와 비교해서 일치여부를 확인한다.
로그인에 성공하면 서버는 응답으로 사용자에게 토큰을 전달한다.
인가
인증을 통해 검증된 사용자가 애플리케이션 내부의 리소스에 접근할 때 해당 리소스에 접근할 권리가 있는지 확인하는 과정
리소스 접근할 때 사용자가 전달한 토큰을 통해 권한 유무를 확인한다.
스프링 시큐리티
애플리케이션의 인증, 인가 등의 보안기능을 제공하는 스프링 하위 프로젝트
스프링 시큐리티는 서블릿 필터(servlet filter)를 기반으로 동작한다.
DispatcherServlet 앞에는 필터가 배치되어 있다. 필터체인은 서블릿 컨테이너에서 관리하는 ApplicationFilterChain을 의미한다.
클라이언트에서 애플리케이션으로 요청을 보내면 서블릿 컨테이너는 URI를 확인해서 필터와 서블릿을 매핑한다.
스프링 시큐리티는 사용하고자하는 필터체인을 서블릿 컨테이너의 필터 사이에서 동작시키기 위해 DelegatingFilterProxy를 사용한다.
DelegatingFilterProxy는 서블릿 컨테이너의 생명주기와 스프링 애플리케이션 컨텍스트사이에서 다리 역할을 하는 필터 구현체로, 역할을 위임할 필터체인 프록시를 내부에 가지고 있다.
필터체인 프록시는 스프링 시큐리티에서 제공하는 필터로 SecurityFilterChain을 통해 많은 보안 필터를 사용할 수 있다.
SecurityFilterChain은 WebSecurityConfigurerAdapter 클래스를 상속받아 설정한다.
스프링 시큐리티에서는 SecurityFilterChain에서 사용하는 필터 중 UsernamePasswordAuthenticationFilter를 통해 인증을 처리한다.
1. 클라이언트로부터 요청을 받으면 서블릿 필터에서 SecurityFilterChain으로 작업이 위임되고 그 중 UsernamePasswordAuthenticationFilter(위 그림에서 AuthenticationFilter)에서 인증을 처리한다.
2. AuthenticationFilter는 요청 객체(HttpServletRequest)에서 username과 password를 추출해서 토큰을 생성한다.
3. 인터페이스 AuthenticationManager 에게 토큰을 전달한다. 일반적으로 사용되는 구현체는 ProviderManager이다.
4. ProviderManager는 인증을 위해 AuthenticationProvider로 토큰을 전달한다.
5. AuthenticationProvider는 토큰의 정보를 UserDetailsService에 전달한다.
6. UserDetailsService는 전달받은 정보를 통해 데이터베이스에서 일치하는 사용자를 찾아 UserDetails 객체를 생성한다.
7. 생성된 UserDetails 객체는 AuthenticationProvider로 전달되며, 해당 Provider에서 인증을 수행하고 성공하게 되면 ProviderManager로 권한을 담은 토큰을 전달한다.
8.ProviderManager는 검증된 토큰을 AuthenticationFilter로 전달한다.
9. AuthenticationFilter는 검증된 토큰을 SecurityContextHolder에 있는 SecurityContext에 저장한다.
이 프로젝트에서는 JWT 토큰으로 인증을 수행할 예정이기 때문에 JWT와 관련된 필터를 생성하고 UsernamePasswordAuthenticationFilter 앞에 배치해 인증을 수행하도록 한다.
'BACK > SPRING' 카테고리의 다른 글
[Spring] Servlet 동작 방식 (0) | 2023.05.23 |
---|---|
스프링MVC - 웹 애플리케이션의 이해 (0) | 2023.02.12 |
Spring Boot Project(6) - 댓글, 대댓글 (0) | 2023.01.24 |
Spring Boot Project(5) - 게시글 페이징, 필터링하기 (0) | 2023.01.24 |
Spring Boot Project(4) - JPA Auditing으로 생성/수정 시간 자동화 (0) | 2023.01.24 |