웹 어플리케이션의 상태 저장(2)
* 본 글은 뉴렉처(Newlecture) 채널의 서블릿, JSP 강의를 참고하여 작성되었습니다.
* 해당 글도 읽어보면 좋을 듯합니다(세션과 쿠키의 관계: https://www.daleseo.com/http-session/)
세션(Session)
세션이란 HTTP 프로토콜에서 브라우저 단위로(사용자 단위) 상태를 서버 측에 저장하는 기술을 말한다.
종류가 다른 두 브라우저 IE, Chrome에서 각각 똑같은 사이트를 요청했을 때, 요청 헤더를 보면 두 브라우저의 세션이 실제로 다름을 알 수 있다.
세션 작동 방식
세션이 작동하는 방식은 다음과 같다.
- 브라우저에서 특정 페이지를 최초로 요청
- 응답시 서버에서 세션을 생성하고, 생성된 세션 ID를 브라우저에 전달(쿠키라는 방식으로)
- 이후에 들어오는 매 요청마다 세션 ID 쿠키를 서버로 전송
- 서버는 요청과 함께 넘어오는 쿠키의 세션 ID로 사용자의 세션을 구분
세션 객체의 메서드
서블릿 코드 내에서 HttpServletRequest.getSession() 메서드를 통해 현재 사용자에 대한 세션 객체를 얻을 수 있다.
getSession() 메서드는 세션 작동 방식에 따라 첫 요청인 경우 세션 객체를 생성해 리턴하고, 같은 사용자가 다시 요청하면 앞에서 생성한 세션 객체를 리턴한다.
아래 표는 세션 객체의 메서드를 정리한 것이다.
메서드 | 설명 |
void setAttribute(String name, Object value) | name, value 쌍을 현재 세션에 저장 |
Object getAttribute(String name) | 인자로 전달된 name에 맞는 value 리턴 |
String getId() | 브라우저별로 할당된 세션 ID 리턴 |
long getCreationTime() | 세션이 생성된 시간 리턴 |
long getLastAccessedTime() | 웹브라우저가 최근에 세션에 접근한 시간 리턴 |
void invalidate() | 세션 종료(세션 객체 제거) |
void setMaxInactiveInterval(int interval) | 초 단위로 세션 유효시간을 지정 |
int getMaxInactiveInterval() | 세션의 유효시간을 초 단위로 리턴 |
쿠키(Cookie)
쿠키란 웹사이트에 필요한 데이터를 클라이언트에 저장하고, 브라우저 요청 순간에 요청과 함께 클라이언트의 쿠키를 서버로 전송하는 기술을 말한다.
브라우저 요청시 브라우저 측에서 서버로 전달되는 정보에는 세 가지가 있다.
- 헤더 정보(브라우저가 알아서 생성 후 전달)
- 사용자 데이터 정보
- 쿠키
쿠키의 작동 과정
- 브라우저 최초 요청
- 서버에서 쿠키 생성한 후 응답에 쿠키 추가해 전달
- 브라우저가 쿠키를 담아 서버에 요청
- 서버가 쿠키 정보를 읽는다.
서버 측에서 쿠키 생성 후 브라우저로 전달하는 법
브라우저에 보낼 쿠키를 생성하기 위해서는, String 타입의 이름과 값을 담은 Cookie 클래스의 객체를 초기화해야 한다.
쿠키 객체를 초기화한 후, 브라우저가 어떤 경로를 요청할 때마다 쿠키를 보낼지, 쿠키의 유효시간 등을 필요에 따라 설정해준다.
쿠키를 설정했으면, 응답할 때 브라우저로 전달하기 위해 response 객체에 쿠키를 담아준다.
서블릿 상에서 어떻게 구현하는지는 아래 코드를 참고하면 될 것 같다.
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hi")
public class Hello extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String name = "forCookie";
String value = "cookie'sValueIsStringType";
// 서버 단에서 브라우저(클라이언트)로 보낼 쿠키 초기화
Cookie cookie = new Cookie(name, value);
// /hi 및 하위 경로를 요청할 때만 브라우저가 받을 이 쿠키를 서버로 전달
cookie.setPath("/hi");
// 쿠키가 유지되는 기간(유효기간)을 초 단위(int)로 설정
cookie.setMaxAge(24 * 60 * 60);
// 응답시 쿠키 전달
response.addCookie(cookie);
}
}
브라우저 요청과 함께 전달된 쿠키값 참조하는 법
브라우저 요청에 필요한 쿠키는 여러 개일 수 있으므로 request 객체를 통해 요청에 담긴 모든 쿠키 정보를 배열 형태로 받아온다.
서버는 쿠키의 이름을 통해 브라우저 측의 요청으로 전달된 쿠키들 중 원하는 쿠키를 찾아 사용할 수 있다.
서블릿 상에서 어떻게 구현하는지는 아래 코드를 참고하면 될 것 같다.
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hi")
public class Hello extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// 브라우저 요청으로 전달되는 모든 쿠키를 배열 형태로 반환
Cookie[] cookies = request.getCookies();
String _c = "";
// 쿠키 배열에서 원하는 이름을 가진 쿠키의 값만 추출
if(cookies != null) {
for(Cookie cookie : cookies) {
if("c".equals(cookie.getName())){
_c = cookie.getValue();
}
}
}
}
}
브라우저에 저장된 쿠키 삭제
브라우저에 저장된 쿠키를 직접적으로 삭제하는 메서드는 없다.
대신, 쿠키를 수정한 뒤 유효시간을 0으로 설정하면 곧바로 삭제된다.
브라우저에서 삭제하려는 쿠키의 이름과 똑같은 Cookie 객체를 response 객체에 담으면 브라우저 상의 쿠키를 수정할 수 있다.
수정할 쿠키의 유효시간을 0으로 설정한다면, 응답 과정에서 쿠키 수정 후에 곧바로 삭제된다.
* 유효시간을 -1로 설정하면, 브라우저 종료시 쿠키가 삭제된다.
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hi")
public class Hello extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// 삭제할 쿠키의 이름과 동일한 쿠키 객체 생성
Cookie cookie = new Cookie("targetName", null);
// 쿠키의 유효시간을 0으로 설정
cookie.setMaxAge(0);
// 쿠키 전송: 유효시간이 0이므로 브라우저 측에서 곧바로 삭제
response.addCookie(cookie);
}
}
상태 저장 방식 비교
지금까지 소개했던 세 가지 상태 저장 방식을 표로 비교하면 아래와 같다.
저장소 | 저장 범위 | 저장 기간 | 저장 위치 |
Application | WAS 전체 | WAS 시작부터 종료까지 | WAS의 메모리 |
Session | 세션(사용자, 브라우저) 범위 | 세션 시작부터 종료까지 | WAS의 메모리 |
Cookie | 웹 브라우저 별 지정한 path(URL) 범위 | 브라우저로 전달한 순간부터 유효기간 만료될 때까지 | 브라우저의 메모리 or 파일 |