공부기록/Study

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

메델 2023. 2. 9. 06:26

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()등의 작업을 감지할 수 있음 

 

(참고: 자바 웹 개발 워크북)