Cookie 란?
쿠키란 서버가 클라이언트에 저장하는 정보로서 클라이언트 쪽에 필요한 정보를 저장해 놓고, 필요할 때 추출하는 것을 지원하는 기술 입니다. 클라이언트와 연결이 끊어져도 클라이언트 개인마다 상태정보를 유지하고자 할때 사용하는 기술 입니다.
(이는 HTTP의 stateless 한 특성 때문에 사용되는 기술 입니다.)
이후 서버 방문시 요청정보의 헤더에 포함되어 전달됩니다.
쿠키는 name 과 value로 구성된 정보이며, 필요에 따라 쿠키 유지시간, 유효 디렉터리, 유효 도메인 등 속성또한 정할 수 있습니다.
다만 사용자 브라우저에 저장되기에 용량에 제한이 있고, 클라이언트에 저장된 쿠키를 직접 접근할수 있기때문에 보안상의 문제가 있을 수 있습니다.
쿠키 생성
Servlet에서는 쿠키를 생성하고, 전송하고, 추출하는 기능의 API들을 제공합니다.
◆ 쿠키 생성 : Cookie(String name, String value)
두개의 인자를 전달받는데 첫 인자가 쿠키의 name이 되며, 두번째 인자가 쿠키의 value가 됩니다.
◆ 유효시간 설정 : SetMaxAge(int expiry)
이 값은 쿠키의 유효시간의 초(second)를 의미합니다. 지정되는 인자에 따라 의미가 다른데, 다음과 같습니다.
음수 : 브라우저 종료시 쿠키 자동삭제
양수 : 양수로 지정한 초만큼 쿠키유지
0 : 쿠키삭제
따로 지정하지 않을경우 자동으로 음수값이 적용되어 브라우저가 종료될때 쿠기도 함께 삭제됩니다.
◆ 쿠키 경로 설정 : setPath(String uri)
서버의 모든 요청에 대하여 쿠키가 서버로 전송되는 것 이 아니라, 특정 경로의 요청에서만 쿠키를 전송하고자 할때 setPath() 메소드를 이용합니다. 인자값으로 받은 uri와 그 하위 경로의 요청에 대해서만 클라이언트로부터 쿠키가 전달됩니다.
아직 명확하게 이해가시지 않는다구요? 저도 그래서 지금 이글을 쓰기로 마음먹었습니다 ㅠ.ㅠ
다음 예시를 확인해 보시죠!
그러나 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 쿠키는 삭제되어있습니다.
'BackEnd > Servlet, JSP' 카테고리의 다른 글
[Servlet, JSP] Servlet Life Cycle : Servlet 생명 주기 (0) | 2022.01.14 |
---|---|
[Servlet, JSP] MVC : Model View Controller (0) | 2022.01.13 |
[Servlet, JSP] FilterConfig, FilterChain (0) | 2022.01.13 |
[Servlet, JSP] RequestDispatcher와 요청 재지정 (0) | 2022.01.13 |
[Servlet, JSP] Session과 login, logout 구현하기 (0) | 2022.01.13 |
댓글