본문 바로가기

공부/개념 정리

[Spring] Filter의 개념

// 혼자 공부하면서 필기식으로 정리한 글입니다. 진행중인 프로젝트의 방향성에 맞게 필터를 적용했습니다.

 

필터의 이유

DispatcherServlet이 요청을 받고 각 요청에 맞는 Controller로 요청을 분배할 때 공통적으로 모든 요청에 필요한 기능이 있을 때 DispatcherServlet보다 앞에 있는 Filter가 공통 기능을 수행해줌

 

Filter 인터페이스를 구현함.

doFilter(ServletRequest, ServletResponse, FilterChain)을 인자로 받음

doFilter를 기준으로 전에는 요청쪽, 후쪽은 응답쪽

@Order는 필터의 위치를 지정해줄 수 있음

 

Filter는 DispatcherServlet보다 앞단에 있어서 쿠키값을 가져오는 메서드를 사용 못 함(@CookieValue를 사용 못함). 따라서 쿠키의 정보를 얻기 위해서는 쿠키에서 토큰값(JWT)을 가져오는 메서드가 필요.

 

Spring security

Spring security는 FilterChain 기반으로 작동

HttpSecurity클래스의 authorizeHttpRequests()는 원하는  요청만 인증을 하고, 원하지 않는 요청은 인증을 하지 않는 메서드 (resosurced에 들어있는 페이지들은 인증을 하지 않는다던지)

기본 로그인 방식을 지원함(폼 로그인 기반)

폼 로그인은 로그인 인증이 되지 않을 경우 로그인 페이지로 보냄

세션 아이디? jwt방식인데 세션 아이디가 왜 필요하지? -> Spring Security는 세션 방식으로 기능을 수행

UsernamePasswordAuthenticationFilter을 통해 사용자 로그인 인증

사용자가 UsernamePassword를 넘기면 UsernamePasswordAuthenticationFilter에서 UsernamePasswordAuthentication 토큰을 만들어서 AuthenticationManager한테 반환

인증 성공 -> SecurityContextHolder에 UsernamePasswordAuthentication 토큰을 저장 -> 인증완료

인증 실패 -> SecurityContextHolder를 비움

// 예시코드
SecurityContext context = SecurityContextHolder.createEmptyContext();
Authentication authentication = new UsernamePasswordAuthenticationToken(principal, credentials, authorities);
context.setAuthentication(authentication); // SecurityContext 에 인증 객체 Authentication 를 저장합니다.

SecurityContextHolder.setContext(context);

SecurityContextHolder 내부

  • principal : 사용자를 식.
    • Username/Password 방식으로 인증할 때 일반적으로 UserDetails 인스턴스.
  • credentials : 주로 비밀번호, 대부분 사용자 인증에 사용한 후 비움.
  • authorities : 사용자에게 부여한 권한을 GrantedAuthority로 추상화하여 사용.-> Security가 제공하는 권한에 따른 접근차이에 사용

UserDetailsService는 Username/password 인증방식을 사용할 때 사용자를 조회하고 검증한 후 UserDetails를 반환.

커스텀 할 때는 Bean으로 등록해서 사용

 

UserDetailsService와 UserDetails를 Implements해서 사용하게 되면 더이상 default 로그인을 사용하지 않는다는 것.->

우리가 사용할 User TABLE을 이용하기 위해선 커스텀을 해야함.