DAY63 - 쿠키와 세션, 필터

은나현·2023년 4월 25일
0

📌 1. 쿠키와 세션

📍 1-1. 쿠키의 종류

  • 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
  • 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료시까지만 유지

📍 1-2. 쿠키의 사용

  • 쿠키 생성 : Cookie newCookie = new Cookie("keyname", value);
  • 쿠키 보내기 : response.addCookie(newCookie);
  • 쿠키 받기 : required 옵션이 false이면 쿠키 정보가 없어도 접근 가능
    public String homeLogin(@CookieValue(name="keyname", 
    			required=false) Long memberId, Model model) 
  • 쿠키 비활성화 : 기존 쿠키 이름으로 만료된 빈 쿠키를 새로 생성하고 응답에 add해서 보냄
    		Cookie cookie = new Cookie(cookieName,null);
    		cookie.setMaxAge(0);
    		response.addCookie(cookie);

📍 1-3. 세션 옵션

  • request.getSession();
    • request.getSession(true);
      : 세션이 있으면 기존 세션을 반환한다. 세션이 없으면 새로운 세션을 생성해서 반환한다.
      true가 default값으로 괄호 안을 생략해도 동일하게 동작한다.
    • request.getSession(false);
      : 세션이 있으면 기존 세션을 반환한다. 세션이 없으면 새로운 세션을 생성하지 않고 null로 반환한다.

➕ 세션 시간

  • Session timeout - 일정 시간 유지된 이후에는 세션을 소멸시킨다.
    • 세션 설정 시간 단위는 초 단위로, 최소 단위는 60초까지 설정 가능하다. 디폴트는 1800초(30분)으로 설정되어 있다.
    • application.properties 파일에서 설정한다.
      • server.servlet.session.timeout=1800

📍 1-4. 세션 사용

  • 세션 생성 : HttpSession session = httpServletrequest.getSession();
  • 속성 설정 : session.setAttribute(key,value);
  • 세션 받기 : session.getAttribute(key);
  • 세션 비활성화 : session.invalidate();
  • @SessionAttribute : session의 attribute들을 name으로 뒤져서 값을 넣어 준다
    	public String homeLoginv3(
    			@SessionAttribute(name=SessionConst.LOGIN_MEMBER, 
    			required=false)Member loginMember, Model model) {

📌 2. 필터

  • 필터는 다음과 같은 순서로 작동한다.
    • HTTP Request -> WAS -> 필터 -> 서블릿 -> 컨트롤러 -> ....

📍 2-1. 필터 생성

// Filter 인터페이스 구현
public class LoginCheckFilter implements Filter{
	// 필터에서 배제할 화이트리스트 전역 배열
	private static final String[] whitelist = 
		{"/","/members/add","/login","/logout","/css/*"};
	// 필터 메서드
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
        // request,response 형변환, URI 획득
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		String requestURI = httpRequest.getRequestURI();
		HttpServletResponse httpResponse = (HttpServletResponse)response;
        // 필터 기능
		try {
			System.out.println("인증 필터 체크 시작 : " + requestURI);
			if(isLoginCheckPath(requestURI)) { // whitelist가 아닌 uri만을 검증
				System.out.println("인증 체크 로직 실행 : " + requestURI);
				HttpSession session = httpRequest.getSession(false);
				if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER)==null){
					System.out.println("미인증 사용자 요청" + requestURI);
					// 로그인으로 redirect (로그인하지 않은 상태로 items url 접근 -> 로그인페이지가 보여져야 함)
					httpResponse.sendRedirect("/login?redirectURL"+requestURI);
					return; //(미인증 사용자는 다음으로 진행하지 않고 종료)
				}
			}
			// 다음으로 진행
			chain.doFilter(request, response);
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			System.out.println("인증 체크 필터 종료 : " + requestURI);
		}
	}
	// 화이트 리스트 경로인지를 체크하는 별도의 메서드
	private boolean isLoginCheckPath(String requestURI) {
		// PatternMatchUtils : 간단한 패턴 매치를 판별하기 위한 유틸
		return !PatternMatchUtils.simpleMatch(whitelist, requestURI);
	}
}
  • chain.doFilter : 필터를 다음으로 진행한다는 뜻의 코드. try 구문 마지막 부분에 넣어 주어야 필터가 계속 실행된다.
  • return : 필터를 더 이상 진행하지 않는다는 뜻의 코드. 이후 필터는 물론 서블릿, 컨트롤러가 더는 호출되지 않는다.
    • 앞서 redirect를 사용했기 때문에 redirect가 응답으로 적용되고 요청이 끝난다.

📍 2-2. 필터 사용

  • 다음과 같은 설정 클래스를 생성해 필터를 등록한다.
    @Configuration
    public class WebConfig {
    	@Bean
    	public FilterRegistrationBean loginCheckFilter() {
    		FilterRegistrationBean<Filter> filterRegistrationBean
    			= new FilterRegistrationBean<>();
    		filterRegistrationBean.setFilter(new LoginCheckFilter());
    		filterRegistrationBean.setOrder(2);
    		filterRegistrationBean.addUrlPatterns("/*");
    		return filterRegistrationBean;
    	}	
    }
  • @Configuration : 설정 클래스에 사용하는 어노테이션. 내부 @Bean 메서드들을 컨테이너에 Bean으로 등록함을 명시한다.
  • @Bean : 스프링 컨테이너는 @Configuration 클래스 내에서 @Bean을 사용하는 메서드를 파싱해 빈을 생성한다.
  • FilterRegistrationBean : 생성한 필터를 사용하기 위해 등록할 때 사용된다.
    • setFilter(new myFilter()) : 필터를 생성해 세팅한다.
    • setOrder(0) : 필터가 적용될 순서를 설정한다.
    • addUrlPatterns("url") : 필터를 적용할 경로 조건을 설정한다.

0개의 댓글