본문 바로가기

Language/Spring Security

Servlet API 통합 - SecurityContextHoladerAwareRequestFilter

728x90
  • 스프링 시큐리티는 다양한 프레임워크 및 API 와의 통합을 제공하고 있으며 Servlet 3과 Spring MVC 와 통합을 통해 여러 편리한 기능들을 사용 가능
  • 인증 관련 기능들을 필터가 아닌 서블릿 영역에서 처리 가능

Servlet3+ 통합

  • SecurityContextHolderAwareRequestFilter
    • HTTP 요청이 처리될 때 HttpServletRequest에 보안 관련 메소드를 추가적으로 제공하는 래퍼(SecurityContextHolderAwareRequestWrapper) 클래스를 적용
    • 이를 통해 개발자는 서블릿 API 의 보안 메소드를 사용하여 인증, 로그인, 로그아웃 등의 작업을 수행 가능
  • HttpServlet3RequestFactory
    • Servlet 3 API 와의 통합을 제공하기 위한 Servlet3SecurityContextHolderAwareRequestWrapper 객체를 생성
      → Servlet3SecurityContextHolderAwareRequestWrapper는 SecurityContextHolderAwareRequestWrapper 클래스를 상속 받음
  • Servlet3SecurityContextHolderAwareRequestWrapper
    • HttpServletRequest의 래퍼 클래스로서 Servlet 3.0의 기능을 지원하면서 동시에 SecurityContextHolder와의 통합을 제공
      → SecurityContextHolder와 통합을 제공한다는 것은 인증 객체를 가지고 인증 관련 기능을 사용한다는 것
    • 이 래퍼를 사용함으로써 SecurityContext 에 쉽게 접근할 수 있고 Servlet 3.0의 비동기 처리와 같은 기능을 사용하는 동안 보안 컨텍스트를 올바르게 관리 가능

구조 및 API

  • authenticate() : 사용자가 인증되었는지 확인하고 인증되지 않았다면 로그인 페이지로 사용자를 보냄
  • login() : AuthenticationManager를 사용하여 사용자가 인증할 수 있도록 함
  • logout() : LogoutHandlers를 사용하여 사용자가 로그아웃 할 수 있도록 함
  • startAsync() : startAsync()을 호출한 스레드에서 발견된 SecurityContext 를 Runnable 을 처리하는 스레드로 자동 복사

 

코드 구현

@GetMapping("/login")
public String login(HttpServletRequest request, MemberDto memberDto) throws ServletException, IOException {
	request.login(memberDto.getUsername(),memberDto.getPassword());
	System.out.println("PreAuthorize");
	return "/index";
} 

@GetMapping("/users")
public List<User> users(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	boolean authenticate = request.authenticate(response);
	if(authenticate){
		UserService.users();
	}
	return Collection.emptyList();
}
  • HttpServletRequest의 객체는 Servlet3SecurityContextHolderAwareRequestWrapper
    • request.login(아이디, 패스워드)를 하면 스프링 시큐리티에서 인증 필터를 통해 처리하는 과정들이 모두 이루어짐
728x90