1. 쿠키
HTTP는 기본적으로 무상태이므로 과거의 요청을 알 수 X
무상태 장점 → 적은 자원으로 여러 개의 요청을 처리 할 수 있음
세션 트래킹(session tracking)
과거의 방문 기록을 추적하는 기법
쿠키(Cookie)
- HTTP에서 세션 트랙킹은 쿠키 이용
- 쿠키 → 문자열로 만들어진 데이터 조각
- 서버와 브라우저 사이에서 요청이나 응답시에 주고 받는 형태로 사용
- 이름(name)과 값(value)의 구조
쿠키를 주고 받는 기본적인 시나리오
- 브라우저에서 최초로 서버를 호출하는 경우에 해당 서버에서 발행한 쿠키가 없다면 브라우저는 아무것도 전송하지 않음
- 서버에서 Response 메시지를 보낼 때 브라우저에게 쿠키를 보내주는데 'Set-Cookie'라는 HTTP 헤더 이용
- 브라우저는 쿠키를 받은 후 쿠키에 있는 유효기간을 보고 파일 형태로 보관할 것인지 메모리 상에서만 처리할 것인지 결정
- 브라우저가 보관하는 쿠키는 다음에 다시 브라우저가 서버에 Request 할때 Http 헤더에 Cookie라는 헤더 이름과 함께 전달
- 서버에서는 필요에 따라서 브라우저가 보낸 쿠키를 읽고 이를 사용
쿠키를 생성하는 방법
- 서버에서 자동으로 생성하는 쿠키
- 응답 메시지를 작성할 때 정해진 쿠키가 없는 경우 자동으로 발행
- WAS에서 발행되며 이름은 WAS마다 고유한 이름을 사용해서 쿠키 생성
- 톰캣은 'JSESSIONID'라는 이름 사용
- 서버에서 발행하는 쿠키는 브라우저의 메모리 상에 보관, 브라우저 종료시 서버에서 발행한 쿠키 삭제
- 서버에서 발행하는 쿠키의 경로 '/'로 지정
- 개발자가 생성하는 쿠키
- 이름을 원하는대로 지정할 수 있음
- 유효기간 지정(유효기간이 지정되면 브라우저가 파일 형태로 보관)
- 반드시 직접 Response 추가
- 경로나 도메인 등을 지정할 수 있음 ( 특정한 서버의 경로를 호출하는 경우에만 쿠키를 사용)
서블릿 컨텍스트
- 프로젝트의 실행 경로를 '/' 이외에 다른 이름으로 각각 지정해서 실행하면 하나의 톰캣 내에서 여러 웹 애플리케이션 실행 가능
- 각각의 웹 애플리케이션은 자신만이 사용하는 고유의 메모리 영역을 하나 생성하여 이 공간에 서블릿이나 JSP 등을 인스턴스로 만들어 서비스를 제공
- 이 영역을 서블릿 API에서는 서블릿 컨텍스트라고 함
세션 저장소(Session Repository)
- '키'와 '값'을 보관하는 구조
- 키가 되는 역할을 하는 것이 톰캣에서 JESSIONID라는 쿠키의 값
- 발행된 쿠키들의 정보를 보관하는 역할
- 새로운 JSESSIONID 쿠키가 만들어 질때마다 메모리 공간을 차지 → 주기적으로 세션 저장소를 조사하면서 더 이상 사용하지 않는 값들을 정리하는 방식으로 동작
- 서블릿 API에서는 HttpServletRequest를 통해 getSession()이라는 메서드로 각 JSESSIONID의 공간에 접근
HttpServletRequest의 getSession()
- JSESSIONID가 없는 경우
- 세션 저장소에 새로운 번호로 공간을 만들고 해당 공간에 접근할 수 있는 객체를 반환,
- 새로운 번호는 브라우저에 JSESSIONID의 값 전송
- JSESSIONID가 있는 경우
- 세션 저장소에서 JSESSIONID 값을 이용해서 할당된 공간을 찾고 이 공간에 접근할 수 있는 객체를 반환
getSession()의 결과물은 세션 저장소 내의 공간, 공간을 의미하는 타입은 HttpSession → 세션 컨텍스트, 세션
HttpSession 타입의 객체를 이용하면 현재 사용자만의 공간에 원하는 객체를 저장하거나 수정/삭제 가능
isNew()와 같은 메서드로 새로운 공간을 만들어 낸 것인지/ 기존의 공간을 재사용하는지 구분할 수 있음
세션을 이용한 로그인 체크
- 사용자가 로그인에 성공하면 HttpSession을 이용해서 해당 사용자의 공간(세션 컨텍스트)에 특정한 객체를 이름과 함께 저장
- 로그인 체크가 필요한 컨트롤러에서는 현재 사용자의 공간에 지정된 이름으로 객체가 저장되어 있는지 확인
- 객체가 존재한다면 해당 사용자는 로그인된 사용자로 간주, 아닌 경우에는 로그인 페이지로 이동
필터를 이용한 로그인 체크
필터
- 특정한 서블릿이나 JSP 등에 도달하는 과정에서 필터링하는 역할을 위해서 존재하는 서블릿 API의 객체
- 로그인 여부를 체크해야 하는 컨트롤러마다 동일하게 로직을 작성하면 같은 코드를 계속 작성해야 하므로 필터를 이용해 처리
- 필터는 한 개이상 적용할 수 있음
- @WebFilter를 이용해서 특정한 경로에 접근할 때 필터가 동작하도록 설계하면 동일한 로직을 필터로 분리할 수 있음
EL의 Scope와 HttpSession 접근하기
EL의 Scope
- EL은 HttpServletRequest에 저장(setAttribute)된 객체를 찾을 수 없다면 자동으로 HttpSession에 저장된 객체를 찾아내는 방식으로 동작하는데 이것을 EL의 Scope라고 함
- 변수의 범위가 있는 것과 같은 개념
- EL의 스코프는 HttpServletRequest나 HttpSession 등에서 setAttribute()로 되어있는 데이터를 찾을 때 사용
- EL로 ${obj}라고 하면 스코프들이 순차적으로 page → request → session → application의 순서대로 'obj'라는 이름으로 저장된 객체를 찾는 방식으로 동작
EL의 스코프를 이용해서 접근하는 변수는 다음과 같이 4가지 종류
Page Scope: JSP에서 EL을 이용해 <c:set>으로 저장한 변수
Request Scope: HttpServletRequest에 setAttribute()로 저장한 변수
Session Scope: HttpSession을 setAttribute()로 저장한 변수
Application Scope: ServletContext를 이용해서 setAttribute()로 저장한 변수
2. 사용자 정의 쿠키
사용자 정의 쿠키 vs WAS에서 발행하는 쿠키(세션쿠키)
사용자 정의 쿠키 | WAS에서 발행하는 쿠키(세션 쿠키) | |
생성 | 개발자가 직접 newCookie()로 생성 경로도 지정가능 | 자동 |
전송 | 반드시 HttpServletResponse에서 addCookie()를 통해야만 전송 | |
유효기간 | 쿠키 생성할 때 초 단위로 지정할 수 있음 | 지정불가 |
브라우저의 보관방식 | 유효기간이 없는 경우에는 메모리상에만 보관 유효기간이 있는 경우에는 파일이나 기타방식으로 보관 |
메모리상에만 보관 |
쿠키의 크기 | 4kb | 4kb |
쿠키를 사용하는 경우
쿠키는 서버와 브라우저 사이를 오가기 때문에 보안에 취약하여 쿠키의 용도는 제한적
오늘 하루 이창 열지 않기, 최근 본 상품 목록 과 같은 서버에서 보관할 필요가 없는 데이터를 쿠키를 이용해 처리
요즘날 '자동 로그인'으로 쿠키의 위상이 달라짐
쿠키와 세션을 같이 활용하기
자동 로그인 = 로그인한 사용자의 정보를 쿠키에 보관하고 이를 이용해서 사용자의 정보를 HttpSession에 담는 방식
3. 리스너
옵저버 패턴
: 특정한 변화를 '구독'하는 객체들을 보관하고 있다가 변화가 발생하면 구독 객체들을 실행하는 방식
리스너
- 서블릿 api에 존재하는 인터페이스
- 이벤트라는 특정한 데이터가 발생하면 리스너 객체들은 자동으로 실행
- 리스너를 이용하면 어떤 정보(이벤트)가 발생 했을 때 미리 약속해둔 동작을 수행할 수 있으므로 기존의 코드를 변경하지 않고도 추가적인 기능을 수행할 수 있다.
서블릿 api는 여러 이벤트에 맞는 리스너들을 인터페이스로 정의 → 이용해서 다음과 같은 작업 처리 가능
- 해당 웹 애플리케이션이 시작되거나 종료될 때 특정한 작업 수행
- HttpSession에 특정한 작업에 대한 감시와 처리
- HttpServletRequest에 특정한 작업에 대한 감시와 처리
ServletContextEvent와 ServletContext
- ServletContextEvent를 이용하면 현재 애플리케이션이 실행되는 공간이 ServletContext에 접근 할 수 있음
- ServletContext = 현재의 웹 애플리케이션 내 모든 자원들을 같이 사용하는 공간, 이 공간에 무언가를 저장하면 모든 컨트롤러나 JSP 등에서 활용할 수 있음
ServletContextListener와 스프링 프레임워크
- ServletContextListener와 ServletContext를 이용하면 프로젝트가 실행될 때 필요한 객체들을 준비하는 작업을 처리할 수 있음
- ex. 커넥션 풀을 초기화하거나 TodoService와 같은 같은 객체들을 미리 생성해서 보관
- 스프링 프레임 워크를 웹 프로젝트에서 미리 로딩하는 작업을 할때 ServletContextListener이용
세션 관련 리스너
- 서블릿의 리스너 중에서 HttpSession 관련 작업을 감시하는 리스너들을 등록할 수 있음
- ex) HttpSessionListener나 HttpSessionAttributeListener → HttpSession이 생성되거나 setAttribute()등의 작업이 이루어질 때 이를 감지
- HttpSessionListener 인터페이스는 arrtibuteAdded(), attributeRemoved(), attributeReplaced()를 이용해서 HttpSession에 setAttribute()/removeAttribute()등의 작업을 감지할 수 있음
(참고: 자바 웹 개발 워크북)
'공부기록 > Study' 카테고리의 다른 글
5-1 올바른 괄호 (0) | 2023.09.14 |
---|---|
[자바 웹개발 워크북] 5장 스프링에서 스프링 부트로 (0) | 2023.02.23 |
[자바 웹개발 워크북] 4장 스프링과 스프링 WebMVC (0) | 2023.02.14 |
[자바 웹개발 워크북] 2장 웹과 데이터베이스 (0) | 2023.02.05 |
[자바 웹개발 워크북] 1장 웹 프로그래밍의 시작 (0) | 2023.02.02 |