BackEnd/Servlet, JSP

[Servlet, JSP] Servlet 과 Cookie

샤아이인 2022. 1. 13.

Cookie 란?

쿠키란 서버가 클라이언트에 저장하는 정보로서 클라이언트 쪽에 필요한 정보를 저장해 놓고, 필요할 때 추출하는 것을 지원하는 기술 입니다. 클라이언트와 연결이 끊어져도 클라이언트 개인마다 상태정보를 유지하고자 할때 사용하는 기술 입니다.

(이는 HTTP의 stateless 한 특성 때문에 사용되는 기술 입니다.)

 

이후 서버 방문시 요청정보의 헤더에 포함되어 전달됩니다.

쿠키는 name 과 value로 구성된 정보이며, 필요에 따라 쿠키 유지시간, 유효 디렉터리, 유효 도메인 등 속성또한 정할 수 있습니다.

 

다만 사용자 브라우저에 저장되기에 용량에 제한이 있고, 클라이언트에 저장된 쿠키를 직접 접근할수 있기때문에 보안상의 문제가 있을 수 있습니다.

 

쿠키 생성

Servlet에서는 쿠키를 생성하고, 전송하고, 추출하는 기능의 API들을 제공합니다.

 

◆ 쿠키 생성 : Cookie(String name, String value)

두개의 인자를 전달받는데 첫 인자가 쿠키의 name이 되며, 두번째 인자가 쿠키의 value가 됩니다.

 

 유효시간 설정 : SetMaxAge(int expiry)

이 값은 쿠키의 유효시간의 초(second)를 의미합니다. 지정되는 인자에 따라 의미가 다른데, 다음과 같습니다.

 

음수 : 브라우저 종료시 쿠키 자동삭제

양수 : 양수로 지정한 초만큼 쿠키유지

0 : 쿠키삭제

 

따로 지정하지 않을경우 자동으로 음수값이 적용되어 브라우저가 종료될때 쿠기도 함께 삭제됩니다.

 

 쿠키 경로 설정 : setPath(String uri)

서버의 모든 요청에 대하여 쿠키가 서버로 전송되는 것 이 아니라, 특정 경로의 요청에서만 쿠키를 전송하고자 할때 setPath() 메소드를 이용합니다. 인자값으로 받은 uri와 그 하위 경로의 요청에 대해서만 클라이언트로부터 쿠키가 전달됩니다.

 

아직 명확하게 이해가시지 않는다구요? 저도 그래서 지금 이글을 쓰기로 마음먹었습니다 ㅠ.ㅠ

다음 예시를 확인해 보시죠!

출처 -  https://dololak.tistory.com/546
만약 path값을 /subDir2/로 지정하면 localhost:8080/subDir2/xx.java 또는 localhost:8080/subDir2/subDir3/xx.java 과 같은 경로로 요청시에만 쿠키가 전송됩니다.

 

그러나 path값을 /subDir2/subDir3/ 으로 지정하는 경우에는 localhost:8080/subDir2/xx.java 와 같이 요청하는 경우에는 상위 디렉터리이므로 쿠키가 전송되지 않습니다.

 

만약 쿠키의 path값을 따로 설정하지 않는 경우 쿠키를 생성했던 페이지의 경로에만 쿠키가 전송됩니다.

예를 들어 localhost:8080/subDir2/setCookie.java 에서 쿠키가 생성되었다면 localhost:8080/subDir2/ 디렉터리나 그 하위 디렉터리로만 쿠키가 전송됩니다.

name
path
전송범위
c1
지정하지 않음
쿠키를 생성했던 URL 범위에서 전송
c2
/subDir2
/subDir2/xx~~ 또는 그 하위 경로인
/subDir2/subDir3/xx~~ 요청시 전송
c3
/subDir2/subDir3
/subDir2/subDir3/xx~~ 요청시 전송

저 아래에서 예시코드를 만들어 보겠습니다.

 

◆ 쿠키 도메인 설정 : setDomain(String domain)

쿠키는 기본적으로 전송된 서버에서만 사용할 수 있지만, 어떤 웹 서버는 서버를 한대만 이용하는 것 이 아닌, 여러대를 사용하기도 합니다. 이럴때 쿠키의 도메인을 설정하여 하나의 서버에서 클라이언트에 보내진 쿠키를 다른 서버 읽어 사용할 수 있게합니다.

 

 쿠키 전송 : addCookie(Cookie cookie)

쿠키를 client 에게 보낼때 HttpServletResponse 객체의 addCookie() 메소드를 이용하면 됩니다.

 

쿠키 등록

쿠키를 생성한 후 클라이언트로 전송해 보겠습니다.

package com.edu.test;

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/cookie1")
public class CookieTest1Servlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		
		Cookie c1 = new Cookie("id", "guest");
		c1.setPath("/");
		resp.addCookie(c1);
		
		Cookie c2 = new Cookie("code", "0001");
		c2.setMaxAge(60 * 60); // 60분간 유지
		c2.setPath("/");
		resp.addCookie(c2);
		
		Cookie c3 = new Cookie("subject", "java");
		c3.setMaxAge(60 * 60 * 24 * 7); // 7일동안 유지
		c3.setPath("/");
		resp.addCookie(c3);
		
		out.println("쿠키 전송 완료");
		out.close();
	}
}
 

실행시 쿠키가 성공적으로 클라이언트 쪽에 저장됨을 알 수 있습니다.

 

쿠키 추출

  쿠키 추출 : Cookie[] getCookies()

클라이언트 에서 갖고있던 쿠키를 서버쪽으로 보냈을때 이를 request 객체를 이용하여 추출할때 사용합니다.

 

  쿠키 검색 : String getName()

쿠키의 이름을 추출합니다.

 

  쿠키 값 추출 : String getValue()

쿠키의 값을 추출할때 사용합니다.

package com.edu.test;

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/cookie2")
public class CookieTest2Servlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		
		Cookie[] list = req.getCookies();
		for(int i = 0; list != null && i < list.length; i++) {
			out.print(list[i].getName() + ":" + list[i].getValue() + "<br>");
		}
		
		out.close();
	}
}
 

실행결과는 다음과 같습니다.

이때 id=guest인 쿠키는 유효시간을 설정하지 않아기 때문에 브라우저가 종료될때 삭제됩니다.

따라서 브라우저를 종료후 다시 접속하면 guest 쿠키는 삭제되어있습니다.

댓글