Cookie 와 Session
1. Cookie(쿠키)
JSP에서 생성하는 쿠키는 웹 서버에서 생성되어 웹 브라우저에 보관하는 데이터이다.
저장된 쿠키는 웹 브라우저에서 웹 서버로 요청할 때마다 함께 보내진다.
1-1. 쿠키 구성 요소
- 이름 : 웹 브라우저는 여러 개의 쿠키를 가지고 있을 수 있기 때문에, 쿠키마다 변별력을 주기 위하여 이름을 사용한다.
- 값 : 웹 브라우저와 웹 서버가 원하는 작업을 수행하기 위하여 사용될 데이터이다.
- 유효시간 : 쿠키가 정상적으로 기능할 수 있는 시간을 setMaxAge()(초 단위) 메서드를 통해 제한한다.
🖍 유효시간을 별도로 지정하지 않으면 웹 브라우저가 종료되면서 쿠키가 삭제 처리된다.
- 도메인 : 같은 쿠키를 함께 공유할 도메인의 범위를 setDomain() 메서드를 통해 지정한다.
메서드로 범위를 지정하더라도 보안 상의 문제로 쿠키는 다른 도메인으로의 전송은 되지 않는다.
🖍 기본적으로는 쿠키가 생성된 서버에만 전송한다.
- 경로 : 쿠키를 함께 공유할 기준이 될 경로(URL의 도메인 이후 부분)를 setPath()로 지정할 수 있다.
여러 JSP에서 사용할 수 있도록 "/"으로 설정하는 경우가 많다.
🖍 경로를 별도로 지정하지 않으면 실행한 URL을 기준한다.
1-2. 쿠키 활용
1-2-1. Cookie class
1) 쿠키 생성
<%
Cookie cookie = new Cookie("cookieName", "cookieValue");
response.addCookie(cookie);
%>
Cookie 클래스를 통해 생성된 객체를 response 기본 객체에 넣어 웹 브라우저에 보낸다.
2) 값 읽기
<%
Cookie[] cookies = request.getCookies();
%>
웹 브라우저의 request 기본 객체의 헤더에 저장된 쿠키를 꺼내어 확인할 수 있다.
웹 브라우저는 여러 개의 쿠키를 가지고 있을 수 있기 때문에 배열 타입으로 받는다.
헤더에 저장된 쿠키가 없는 경우에는 null을 return한다.
🖍 null 이 return 될 수 있기 때문에 null check를 하지 않으면 NullPointerException이 발생할 수 있다.
3) 값 변경
<%
Cookie cookie = new Cookie("name", URIEncoder.encode("변경할 값", "utf-8"));
response.addCookie(cookie);
%>
쿠키는 값을 변경하기 위하여 같은 이름의 쿠키의 객체를 새로 생성하는 방법을 사용한다.
이러한 방법은 기존에 같은 이름의 쿠키가 존재하지 않으면 변경이 아닌 생성만 되기 때문에,
변경 전 변경하고자 하는 이름의 쿠키가 있는지 먼저 확인하는 코드가 필요하다.
4) 삭제
<%
Cookie cookie = new Cookie(name, value);
cookie.setMaxAge(0);
response.addCookie(cookie);
%>
쿠키를 삭제하기 위한 별도의 메서드가 제공되지 않기 때문에 유효시간(0)을 이용한다.
1-2-2. Cookies class
1) 생성
<%
Cookie cookie = Cookies.createCookie("name", "value");
Cookie cookie = Cookies.createCookie("name", "value", "path", "maxAge");
Cookie cookie = Cookies.createCookie("name", "value", "domain", "path", "maxAge");
%>
createCookie() 메서드는 위와 같이 세 가지 패턴으로 제공된다.
Cookie 클래스에서 하나하나 지정해야 했던 부분을 간략하게 설정할 수 있다는 장점이 있다.
2) 값 읽기
<%
// request 기본 객체로부터 쿠키 정보를 읽어 온다.
Cookies cookies = new Cookies(request);
// 특정 쿠키가 존재하는지 확인
if(cookies.exists("name")) {
// getCookie() 메서드 사용 : Cookie 클래스로 사용 가능
Cookie cookie = cookies.getCookie("name");
// getValue() 매서드 사용 : "name"에 해당하는 쿠키의 값을 반환
String value = cookies.getValue("name");
}
%>
2. Session(세션)
session은 웹 컨테이너에 정보를 보관할 때 사용하며, 서버에서만 생성할 수 있다.
한 웹 브라우저마다 한 개의 session을 할당 받을 수 있다.
2-1. session 생성 및 활용
JSP 의 page 디렉티브는 기본적으로 session 속성을 true 로 설정하고 있다.
🖍 설정을 false 로 변경하게 되면 session 을 만들지 않겠다고 하는 것이다.
session은 웹 브라우저의 최초 요청에 의하여 만들어지며, 이후의 요청은 이미 생성된 session이 사용된다.
session은 session 기본 객체를 통해 사용할 수 있다.
session.setAttribute("name", "value") 메서드로 값을 저장할 수 있고,
session.getAttribute("name") 메서드를 통해 값을 읽어 올 수 있다.
✍️ request.getSession() 으로 session 생성
request 기본 객체의 getSession() 메서드는 session 이 존재하면 해당 session 을 return,
존재하지 않으면 새로운 session 을 생성한다.
🖍 존재하지 않을 때 새로운 session 생성을 원하지 않을 경우
getSession(false)로 작성하여 null 을 return 받을 수 있다.
2-2. session 유효 시간 및 종료
session 은 마지막 접근 이후 일정한 시간 동안 접근하지 않으면 자동으로 세션을 종료하는 기능을 가졌다.
session 에 대하여 종료하기까지 걸리는 유효 시간을 조절하는 방법은 아래와 같이 두 가지 방법이 있다.
- <session-config> 태그 설정(분 단위)
- setMaxInactiveInterval() 메서드 설정(초 단위)
🖍 태그 설정에서 값을 0 또는 음수로 설정하면 실질적으로 session 을 종료하지 않는 한 객체가 서버에 계속 유지하게 되는데,
이러한 경우 사용되지 않는 경우에도 메모리에 계속 남게 되어 이후 메모리 부족 현상을 겪을 수 있다.
session 은 invalidate() 메서드를 통해서 명시적으로 종료시킬 수 있다.
🖍 기존의 session 을 종료하더라도 새로운 요청이 있을 경우에는 새로운 session 객체가 만들어진다.
3. Cookie 와 Session 비교
cookie 는 웹 브라우저에 session 은 웹 서버에 저장된다는 점에서 가장 큰 차이점을 가지고 있다.
이러한 차이점으로 인하여 cookie 는 session 에 비하여 보안에 있어서 취약점을 가지게 되었다.
🖍 하지만 데이터를 웹 브라우저에 가지고 있게 되면서 웹 서버의 부담을 줄일 수 있다.
✍️ JSESSIONID Cookie
session 은 웹 서버에만 데이터를 저장하여 보안에 있어 이점을 얻었다.
하지만 어떤 웹 브라우저가 어떤 session 과 연결되어 있는지 판단할 수 없다.
이를 위해서는 웹 서버는 웹 브라우저에 session 의 고유한 ID 값을 전송하고,
웹 브라우저는 웹 서버에 요청할 때마다 저장된 값을 보내서
자신이 어떤 session 과 연결되어야 하는지 알려주는 방법이 필요하다.
이 경우에 웹 브라우저에 값을 저장하고 그 값을 웹 서버에도 보내기 위해 JSESSIONID Cookie 를 사용할 수 있다.