3.1 세션과 필터
HTTP:
- 무상태: 과거의 요청 기록을 알 수 없음.
- 여러 개의 요청을 처리할 수 있다는 장점
- 과거의 방문 기록을 추적할 수 없기에, 추가적인 기법을 요구함 -> 세션 트래킹
쿠키: 문자열로 만들어진 데이터의 조각, 서버와 브라우저 사이에서 요청과 응답 시에 주고받음.
- 기본적인 쿠키의 형태: 이름과 값.
- 브라우저에서 최초로 서버를 호출하는 경우, 서버에서 발생한 쿠키가 없으면 브라우저는 전송하지 않음.
- 서버에서 응답을 보낼 때 브라우저에게 쿠키를 보내주는데, Set-Cookie라는 HTTP 헤더를 이용함.
- 브라우저는 쿠키를 받은 후, 정보를 읽고, 파일 형태로 보관하거나 메모리에서 처리할건지 결정함
- 이때의 판단 기준은 쿠키의 유효기간 / 만료기간
- 브라우저가 보관하는 쿠키는 다시 서버에 요청할 때 'Cookie' 헤더와 같이 전달.
- 서버에서 브라우저가 보낸 쿠키를 읽고 사용함.
쿠키 생성 방법:
- 서버에서 자동으로 생성:
- 정해진 쿠키가 없는 경우 자동으로 발행 - WAS에서 발행함.
- WAS마다 고유한 이름을 사용해서 쿠키를 생성.
- TOMCAT에서는 JSESSIONID라는 이름 사용.
- 개발자가 생성하는 쿠키:
- 이름 / 유효기간 지정할 수 있음
- 반드시 직접 응답에 추가해 주어야 함
- 한 톰캣에 여러 개의 웹 애플리케이션 (프로젝트)가 실행될 수 있음.
- 각 웹 애플레케이션을 생성할 때에 톰캣이 발행하는 쿠키들을 관리하기 위한 메모리 영역이 생성됨
- 이 '메모리 영역'을 '세션 저장소' 라고 함.
세션 저장소에서는 쿠키들의 정보를 보관하게 되는데, 새로운 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()의 작업이 이루어질때 감지할 수 있다.
'Computer Science > Spring' 카테고리의 다른 글
[자바 웹 개발 워크북] 2장: 웹과 데이터베이스 (0) | 2024.04.17 |
---|---|
[자바 웹 개발 워크북] 1장: 웹 프로그래밍의 시작 (0) | 2024.04.10 |