heeyaaa! 2021. 7. 26. 15:04
SMALL

인증처리

 

1. 톰캣 - 필터!!! 

/post로 들어올 때 세션이 있으면 진입하게 한다 (필터로 인증처리)

필터로 인증처리 한다는 건 입구에서 한다는 것.

 

 

web.xml에서 필터를 준다?

 

필터가 할 수 있는 건 전처리만 할 수 있다. 후처리는 못한다.

ex) 중국에서 들어오는 아이피 다 막고 싶다 -> 필터에서 막음. (서블릿 필터 (인플리먼트에서 필터))

공통적인 처리를 하고 싶으면 필터에서 하면 된다.

 

2. 스프링 - (리플렉션을 통한 AOP)

AOP : 함수 전에 일어나는 일과 후에 일어나는 일  post 관련된 다름 함수에서도 앞뒤제어가 된다.

필터는 앞뒤제어가 안 된다.

 

reflection : 미리 함수를 안 만들어 놓을 수 있다. 껍데기 함수 or 어노테이션 하나 만들어 놓는다.(함수의 틀만). <class파일은 커스터마이징을 못한다. > 다른 함수를 만들어 놓는 건 아니지만 어떤 요청(함수 호출)을 하면 동적으로 함수를 만들 수 있다. 리플렉션은 실시간으로 클래스 안에 있는 함수, 변수, 어노테이션등을 보고 분석하는 것(컴파일 시가 아니라 요청 시에 분석하는 것)

https://madplay.github.io/post/java-reflection

그래서 모델로 만드는 것 보단 DTO를 만들어서 validation check를 하고 리플렉션 하는 게 좋다.

ex) 함수 앞에 @SessionCheck를 붙여준다.

필터와 리플렉션과 연결하면? /post로 갈때

 

 

3. 인터셉터 (필터 + 리플렉션을 통한  AOP)

(AOP 기반으로 만들어진 라이브러리) : 함수 직전과 직후를 관리할 수 있는 것

config 폴더 만들고 자바 파일 만들기
preHandle을 쓸 것임
@Configuration으로 메모리에 띄운다,
로그인이 안 된 상태에서 상세보기를 누르면
로그인 폼으로 이동한다.

이러면 로그아웃 상태에서 /post로 들어가는 건 모두 blocking 당한다.

 

주소 설계 연구 -> 주소를 잘 적어야지 공통적으로 주는 패턴을 막을 수 있다. 

로그아웃된 상태에서 auth만 들어갈 수 있다.

SessionInterceptor.java

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;

public class SessionInterceptor implements HandlerInterceptor {

    // 리턴이 true면 함수 진입, false면 진입 못함.
    // session 이 있을 때 true
    // 핵심 로직을 넣는 게 아니라 공통 관심사를 넣음
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        HttpSession session = request.getSession();
        if (session.getAttribute("principal") == null) {
            response.sendRedirect("/auth/loginForm");
            return false; // UX를 위해서 로그인 폼으로 보내준다.
        }
        return true;
    }
}

WebMvcConfig.java

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    // 인터셉터 등록(언제 동작해야할지)
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SessionInterceptor()).addPathPatterns("/post/**").addPathPatterns("/user/**");
        // 메모리에 뜰 때 자동실행된다.
    }
}

공통 관심사에 대한 코드를 적는 것과 주소를 설계하는 것 중요하다

숙제 - 상세보기는 인증이 필요없다, 해결해 보자.

excludePathPatterns()사용하고 get과 delete 문제 해결하기

 

 

4. 시큐리티 (인터셉터 + 보안)

-> 궁금하면 유튜브로 공부

 

 

LIST