Computer Science/Spring

[자바 웹 개발 워크북] 3장: 세션 / 쿠키 / 필터 / 리스너

무니화니 2024. 4. 29. 15:08

3.1 세션과 필터

HTTP:

  • 무상태: 과거의 요청 기록을 알 수 없음.
    • 여러 개의 요청을 처리할 수 있다는 장점
    • 과거의 방문 기록을 추적할 수 없기에, 추가적인 기법을 요구함 -> 세션 트래킹

쿠키: 문자열로 만들어진 데이터의 조각, 서버와 브라우저 사이에서 요청과 응답 시에 주고받음.

  • 기본적인 쿠키의 형태: 이름과 값.
    • 브라우저에서 최초로 서버를 호출하는 경우, 서버에서 발생한 쿠키가 없으면 브라우저는 전송하지 않음.
    • 서버에서 응답을 보낼 때 브라우저에게 쿠키를 보내주는데, Set-Cookie라는 HTTP 헤더를 이용함.
    • 브라우저는 쿠키를 받은 후, 정보를 읽고, 파일 형태로 보관하거나 메모리에서 처리할건지 결정함
      • 이때의 판단 기준은 쿠키의 유효기간 / 만료기간
    • 브라우저가 보관하는 쿠키는 다시 서버에 요청할 때 'Cookie' 헤더와 같이 전달.
    • 서버에서 브라우저가 보낸 쿠키를 읽고 사용함.

쿠키 생성 방법:

  1. 서버에서 자동으로 생성:
    • 정해진 쿠키가 없는 경우 자동으로 발행 - WAS에서 발행함.
    • WAS마다 고유한 이름을 사용해서 쿠키를 생성.
      • TOMCAT에서는 JSESSIONID라는 이름 사용.
  2. 개발자가 생성하는 쿠키:
    • 이름 / 유효기간 지정할 수 있음
    • 반드시 직접 응답에 추가해 주어야 함
    • 한 톰캣에 여러 개의 웹 애플리케이션 (프로젝트)가 실행될 수 있음.
    • 각 웹 애플레케이션을 생성할 때에 톰캣이 발행하는 쿠키들을 관리하기 위한 메모리 영역이 생성됨
    • 이 '메모리 영역'을 '세션 저장소' 라고 함.
      세션 저장소에서는 쿠키들의 정보를 보관하게 되는데, 새로운 JSESSIONID 쿠키가 생성될 때마다 메모리 공간을 차지하는 문제 발생.
    •  

이를 해결하기 위해 톰캣은 주기적으로 세션 저장소를 조사하면서 사용하지 않는 값들을 정리함.

  •  

HttpServletRequest에서 getSession()을 통해서:

  • JSESSIONID가 없는 경우 : 세션 저장소에서 새로운 번호로 공간을 만듦 -> 접근할 수 있도록 객체 반환
    • 새로운 번호는 JSESSIONID의 값으로 전송 -> 세션 쿠키
  • JSESSIONID가 있는 경우 : 할당된 공간을 찾고 이 공간에 접근할 수 있는 객체를 반환

세션을 이용하여, 로그인 상태인지 체크해보자!

사용자가 로그인에 성공했을 시, HTTPSession을 이용하여 해당 사용자의 공간 (세션 컨텍스트)에 특정한 객체를 key와 저장
로그인 체크가 필요한 컨트롤러는 key로 객체가 저장되어있는지 확인함.

  • 객체가 존재하면 로그인된 사용자, 아니면 로그인 페이지로 이동시킴.
HttpSession session=req.getSession();
if (session.isNew()) -> JSESSSIONID 없음.
if (session.getAttribute("loginInfo") == null) -> JsessionID는 있으나, loginfo 이름으로 저장된 객체가 없음.
req.getRequestDispatcher -> 나머지 경우

필터를 이용하여 로그인 체크

로그인 여부를 체크하는 컨트롤러를 계속 작성하는 것을 방지하기 위해서 필터를 이용하여 처리함.

필터: 특정 서블릿이나 JSP에 도달하는 과정에서 필터링하는 역할을 위해 존재하는 서블릿 API의 특별한 객체.
  • @WebFilter 어노테이션을 이용하여 특정한 경로에 접근 할 때 필터가 동작하도록 설계
  • 한 개 이상의 필터 사용 가능.
@WebFilter (urlPatterns= {"todo/*"}
public class LoginCheckFilter implements Filter {
    @Override
    public void doFilter (ServletRequest request, ServletResponse response, FilterChain chian) throws IOException, ServletException{
    chain.doFilter(request,response);
    }
}

UTF-8 처리 필터: 한글이 깨지지 않도록 사용.

3.2 사용자 정의 쿠키 (Cookie)

사용자 정의 쿠키:

  • 개발자가 직접 newCookie()로 생성
  • 반드시 HttpServletResponse에 addCookie()를 사용해야함
  • 쿠키 생성할 때 초 단위로 지정할 수 있음
  • 유효기간이 없는 경우: 메모리 상에서만 보관 가능
  • 유효기간이 있는 경우: 파일이나 기타 방식으로 보관 가능
  • 쿠키의 크기: 4kb
UUID: 범용 고유 식별자 : 고유한 번호 랜덤으로 생성할 때 사용

3.3 리스너 (Listener)

옵저버 패턴: 특정한 변화를 '구독'하다가 변화가 발생하면 구독 객체를 실행시킴

  • 해당 웹 애플리케이션이 시작되거나 종료될 때 특정 작업 수행
  • HttpSession에 특정한 작업에 대한 감시와 처리
  • HttpServletRequest에 특정한 작업에 대한 감시와 처리

HttpSessionListener나 HttpSessionAttributeListner 에서 HttpSession이 생성되거나 setAttribute()의 작업이 이루어질때 감지할 수 있다.