인증처리
인증처리
1. 톰캣 - 필터!!!
/post로 들어올 때 세션이 있으면 진입하게 한다 (필터로 인증처리)
필터로 인증처리 한다는 건 입구에서 한다는 것.
web.xml에서 필터를 준다?
필터가 할 수 있는 건 전처리만 할 수 있다. 후처리는 못한다.
ex) 중국에서 들어오는 아이피 다 막고 싶다 -> 필터에서 막음. (서블릿 필터 (인플리먼트에서 필터))
공통적인 처리를 하고 싶으면 필터에서 하면 된다.
2. 스프링 - (리플렉션을 통한 AOP)
AOP : 함수 전에 일어나는 일과 후에 일어나는 일 post 관련된 다름 함수에서도 앞뒤제어가 된다.
필터는 앞뒤제어가 안 된다.
reflection : 미리 함수를 안 만들어 놓을 수 있다. 껍데기 함수 or 어노테이션 하나 만들어 놓는다.(함수의 틀만). <class파일은 커스터마이징을 못한다. > 다른 함수를 만들어 놓는 건 아니지만 어떤 요청(함수 호출)을 하면 동적으로 함수를 만들 수 있다. 리플렉션은 실시간으로 클래스 안에 있는 함수, 변수, 어노테이션등을 보고 분석하는 것(컴파일 시가 아니라 요청 시에 분석하는 것)
https://madplay.github.io/post/java-reflection
그래서 모델로 만드는 것 보단 DTO를 만들어서 validation check를 하고 리플렉션 하는 게 좋다.
필터와 리플렉션과 연결하면? /post로 갈때
3. 인터셉터 (필터 + 리플렉션을 통한 AOP)
(AOP 기반으로 만들어진 라이브러리) : 함수 직전과 직후를 관리할 수 있는 것
이러면 로그아웃 상태에서 /post로 들어가는 건 모두 blocking 당한다.
주소 설계 연구 -> 주소를 잘 적어야지 공통적으로 주는 패턴을 막을 수 있다.
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. 시큐리티 (인터셉터 + 보안)
-> 궁금하면 유튜브로 공부