@Slf4j
public class LoginCheckFilter implements Filter {

Filter를 구현하는 클래스를 만들어 주었다.

public default void init(FilterConfig filterConfig) throws ServletException {}

public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;

public default void destroy() {}

Filter 인터페이스는 3가지 init, doFilter, destroy 구현체를 제공하는데 위와 같이 doFilter 외는 default를 사용하고 있으므로 따로 구현하지 않아도 된다.

@Slf4j
public class LoginCheckFilter implements Filter {

    private static final String[] whitelist = {
						"/user/regUser/insert",
            "/user/regUser",
            "/user/logIn",
            "/user/logIn/page",
            "/css/*",
            "/session-info"
						};

먼저, whitelist를 만들어 주었다. 이 화이트 리스트에서는 Session이 없는 미인증 사용자가 접근할 수 있는 페이지 경로를 설정해 주었다.

예를 들면, Session이 없어도 로그인 페이지와 회원가입 등은 보여줘야 하니 여기에 체크해 주었다.

아직 구현하지 않은 비밀번호 찾기와 같은 페이지는 따로 적어주지 않았다. 나중에 필요에 따라 천천히 추가할 예정이다.

@Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String requestURI = httpRequest.getRequestURI();

        HttpServletResponse httpResponse = (HttpServletResponse) response;

        try{
            log.info("인증 체크 필터 시작 = {}", requestURI);

            if (isLoginCheckPath(requestURI)) {

                log.info("인증 체크 로직 실행 = {}", requestURI);
                HttpSession session = httpRequest.getSession(false);

                if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {

                    log.info("미인증 사용자 요청 = {}", requestURI);
                    
										//로그인으로 redirect
                    httpResponse.sendRedirect("/user/logIn"); 
										//?redirectURL=" + requestURI 입력했던 경로로 가고 싶을 떄
                    return;
                }
            }

            chain.doFilter(request, response);
        } catch (Exception e) {
            throw e; //예외 로깅 가능 하지만, 톰캣까지 예외를 보내주어야 한다.
        }finally {
            log.info("인증 체크 필터 종료 = {}", requestURI);
        }
    }

인증 체크 필터가 시작되면 먼저 들어간 링크가 위에서 등록한 Session을 가지고 있지 않은 사용자도 접근이 가능한 화이트 리스트에 속한 페이지 경로인지 체크한다.

그 다음에 Session이 있는지 체크한다. Session이 없다면 로그인 창으로 돌려보내준다.

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean<Filter> loginCheckFilter() {
        FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
        filterFilterRegistrationBean.setFilter(new LoginCheckFilter());
        filterFilterRegistrationBean.setOrder(1); // 적용 순서
        filterFilterRegistrationBean.addUrlPatterns("/*"); //어디에 적용할지?, 화이트 리스트로 걸러줘서 다 넣어도 된다.
        return filterFilterRegistrationBean;
    }
}

WebConfig를 만들고 Configuration 어노테이션을 임포트 해준 뒤 위에서 만들어준 Filter를 등록한다.