1. 개요

이 사용방법(예제)에서는 Servlets을 사용하여 Java에서 쿠키 및 세션을 처리하는 방법을 다룹니다 .

또한 쿠키가 무엇인지 간단히 설명하고 이에 대한 몇 가지 샘플 사용 사례를 살펴보겠습니다.

간단히 말해서 쿠키는 서버가 클라이언트와 통신할 때 사용하는 클라이언트 측에 저장된 작은 데이터 조각입니다 .

후속 요청을 보낼 때 클라이언트를 식별하는 데 사용됩니다 . 또한 한 서블릿에서 다른 서블릿으로 일부 데이터를 전달하는 데 사용할 수도 있습니다.

자세한 내용은 이 문서 를 참조하십시오 .

Cookie 클래스는 javax.servlet.http 패키지에 정의 되어 있습니다 .

클라이언트에 보내 려면 하나를 생성하고 응답에 추가해야 합니다 .

Cookie uiColorCookie = new Cookie("color", "red");
response.addCookie(uiColorCookie);

그러나 API는 훨씬 더 광범위합니다. 자세히 살펴보겠습니다.

주어진 쿠키가 몇 초 동안 유효해야 하는지를 정의하는 최대 수명( maxAge(int) 메서드 사용)을 설정할 수 있습니다.

uiColorCookie.setMaxAge(60*60);

최대 연령을 1시간으로 설정했습니다. 이 시간 이후에는 요청을 보낼 때 클라이언트(브라우저)에서 쿠키를 사용할 수 없으며 브라우저 캐시에서도 쿠키를 제거해야 합니다.

Cookie API 의 또 다른 유용한 메서드 는 setDomain(String) 입니다.

이를 통해 클라이언트가 전달해야 하는 도메인 이름을 지정할 수 있습니다. 또한 도메인 이름을 명시적으로 지정했는지 여부에 따라 다릅니다.

쿠키의 도메인을 설정해 보겠습니다.

uiColorCookie.setDomain("example.com");

쿠키는 example.com 및 해당 하위 도메인에서 만든 각 요청에 전달됩니다 .

도메인을 명시적으로 지정하지 않으면 쿠키를 생성한 도메인 이름으로 설정됩니다 .

예를 들어 example.com 에서 쿠키를 생성하고 도메인 이름을 비워두면 www.example.com (하위 도메인 없이)으로 전달됩니다.

도메인 이름과 함께 경로도 지정할 수 있습니다. 다음에 살펴보겠습니다.

경로는 쿠키가 전달될 위치를 지정합니다.

경로를 명시적으로 지정하면 쿠키 가 주어진 URL과 모든 하위 디렉터리로 전달됩니다.

uiColorCookie.setPath("/welcomeUser");

암시적으로 쿠키와 모든 하위 디렉터리를 생성한 URL로 설정됩니다.

이제 Servlet 내에서 값을 검색하는 방법에 초점을 맞추겠습니다 .

2.5. 서블릿에서 쿠키 읽기

쿠키는 클라이언트의 요청에 추가됩니다. 클라이언트는 매개변수를 확인하고 현재 URL로 전달할 수 있는지 결정합니다.

서블릿 에 전달 된 요청( HttpServletRequest )에서 getCookies() 를 호출하여 모든 쿠키를 가져올 수 있습니다 .

이 배열을 반복하고 이름을 비교하여 필요한 것을 검색할 수 있습니다.

public Optional<String> readCookie(String key) {
    return Arrays.stream(request.getCookies())
      .filter(c -> key.equals(c.getName()))
      .map(Cookie::getValue)
      .findAny();
}

브라우저에서 쿠키를 제거 하려면 이름은 같지만 maxAge 값이 0으로 설정된 새 쿠키를 응답에 추가해야 합니다 .

Cookie userNameCookieRemove = new Cookie("userName", "");
userNameCookieRemove.setMaxAge(0);
response.addCookie(userNameCookieRemove);

쿠키 제거를 위한 샘플 사용 사례는 사용자 로그아웃 작업입니다. 활성 사용자 세션에 대해 저장된 일부 데이터를 제거해야 할 수 있습니다.

이제 우리는 Servlet 내부에서 쿠키를 처리하는 방법을 알고 있습니다 .

다음으로 서블릿 에서 매우 자주 액세스하는 또 다른 중요한 객체 인 세션 객체 를 다룰 것 입니다.

3. HttpSession 객체

HttpSession여러 요청에서 사용자 관련 데이터를 저장하기 위한 또 다른 옵션입니다. 세션은 컨텍스트 데이터를 보관하는 서버 측 저장소입니다.

데이터는 서로 다른 세션 개체 간에 공유되지 않습니다(클라이언트는 해당 세션에서만 데이터에 액세스할 수 있음). 또한 키-값 쌍을 포함하지만 쿠키와 비교하여 세션은 개체를 값으로 포함할 수 있습니다. 스토리지 구현 메커니즘은 서버에 따라 다릅니다.

세션은 쿠키 또는 요청 매개변수로 클라이언트와 일치합니다. 더 많은 정보는 여기 에서 찾을 수 있습니다 .

3.1. 세션 받기

요청에서 바로 HttpSession 을 얻을 수 있습니다 .

HttpSession session = request.getSession();

위의 코드는 존재하지 않는 경우 새 세션을 생성합니다. 다음을 호출하여 동일한 결과를 얻을 수 있습니다.

request.getSession(true)

기존 세션을 얻고 새 세션을 만들지 않으려면 다음을 사용해야 합니다.

request.getSession(false)

JSP 페이지에 처음 액세스하면 기본적으로 새 세션이 생성됩니다. 세션 속성을 false 로 설정하여 이 동작을 비활성화할 수 있습니다 .

<%@ page contentType="text/html;charset=UTF-8" session="false" %>

대부분의 경우 웹 서버는 세션 관리를 위해 쿠키를 사용합니다. 세션 객체가 생성되면 서버 는 세션을 식별하는 JSESSIONID 키와 값으로 쿠키를 생성합니다.

3.2. 세션 속성

세션 개체는 주어진 사용자 세션에 대해 생성된 속성에 액세스(생성, 읽기, 수정, 제거)하기 위한 여러 메서드를 제공합니다.

  • 세션 속성을 키와 새 값으로 생성하거나 대체하는 setAttribute(String, Object)
  • 주어진 이름(키)으로 속성 값을 읽는 getAttribute(String )
  • 주어진 이름을 가진 속성을 제거하는 removeAttribute(String)

또한 getAttributeNames() 를 호출하여 기존 세션 속성을 쉽게 확인할 수 있습니다 .

이미 언급했듯이 요청에서 세션 개체를 검색할 수 있습니다. 이미 가지고 있다면 위에서 언급한 방법을 빠르게 수행할 수 있습니다.

속성을 만들 수 있습니다.

HttpSession session = request.getSession();
session.setAttribute("attributeKey", "Sample Value");

속성 값은 키(이름)로 얻을 수 있습니다.

session.getAttribute("attributeKey");

더 이상 필요하지 않으면 속성을 제거할 수 있습니다.

session.removeAttribute("attributeKey");

사용자 세션에 대한 잘 알려진 사용 사례는 사용자가 당사 웹 사이트에서 로그아웃할 때 저장하는 전체 데이터를 무효화하는 것입니다. 세션 개체는 이에 대한 솔루션을 제공합니다.

session.invalidate();

이 방법은 웹 서버에서 전체 세션을 제거하므로 더 이상 속성에 액세스할 수 없습니다.

HttpSession 개체에는 더 많은 메서드가 있지만 우리가 언급한 메서드가 가장 일반적입니다.

4. 결론

이 기사에서는 서버에 대한 후속 요청인 쿠키와 세션 사이에 사용자 데이터를 저장할 수 있는 두 가지 메커니즘을 다루었습니다.

HTTP 프로토콜은 상태 비저장이므로 요청 간에 상태를 유지해야 합니다.

항상 그렇듯이 코드 스니펫은 Github에서 사용할 수 있습니다 .

res – REST with Spring (eBook) (everywhere)