[JSP] 16. 쿠키(Cookie) - 프로젝트(생성, 조회, 삭제)
쿠키에 대해서 소개하려고 한다.
쿠키라는 부분은 조작을 해버리면, 보안 자체가 매우 취약해서 사용 안 하는 것을 권장한다.
물론 전혀 사용 안 하는 것은 아니다.
쿠키는 서버 측으로부터 세션을 클라이언트로부터 내려받아서 세션 유지를 처리해주는 기술 중 하나이다.
서버와의 연결이 끊어져도 쿠키를 통해서 정보를 유지할 수 있다.
인터넷 검색을 시도 해보면, "특정 쿠키 변경"도 종종 검색되긴 하지만, 수 차례 태스트 결과로는 변경 작업은 시도 할 수 없다.
시도하려면, 쿠키를 전체 제거하고 다시 생성하는 방법 말고는 딱히 없다고 본다.
1. Cookie란?
쿠키란, 서버가 클라이언트에 저장하는 정보로써 클라이언트 쪽에 필요한 정보를 저장해놓고 필요할 때 추출하는 것을 지원하는 기술이다.
쿠키는 간단하게 구현할 수 있어서 "사용자 인증", "쇼핑몰 구축" 등에도 사용할 수 있지만, 브라우저에 저장되는 한계, 클라이언트가 직접 쿠키를 조작할 수 있기 때문에 보안에 취약해지는 단점이 있다.
- Cookie 생성 = new Cookie(String name, String value)
- 유효시간 설정 = setMaxAge(int expiry)
- 쿠키 경로 설정 = setPath(String uri)
- 쿠키 도메인 설정 = setDomain(String domain)
- 쿠키 전송 = addCookie(Cookie cookie)
...... 쿠키는 직접 코드를 보는 게 훨씬 이해되는 데 도움된다고 주장한다.
2. Project 생성하기
이번 프로젝트는 꼭 반드시 Maven Project로 생성해야만 동작하는 건 아니다.
pom.xml을 사용하면, 라이브러리 관리가 수월해져서 그렇다.
그림 1. Maven Project 생성하기
org.apache.maven.archetypes | maven-archetype-webapp를 선택한 후 Next를 누른다.
그림 2. Maven Project 생성하기
Group ID와 Artifact Id를 입력한다.
Finish를 누른다.
3. pom.xml - 설정하기
이 글에서는 javax.servlet만을 추가하였다.
그림 3. Maven Project 생성하기
Java Resources에서 오른쪽 버튼을 누른다.
New->Servlet을 클릭한다.
그림 4. Servlet 생성 방법1
Java package명과 Class name명을 입력한다.
Finish를 누른다.
그림 5. Servlet 생성 방법2~4(반복)
5. web.xml - 설정하기
크게 많은 것을 작성한 건 아니다.
servlet 부분은 자동생성된 부분이다.
web-app, init-param 등 몇 가지를 수정, 추가하였다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Archetype Created Web Application</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.do</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.do</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>CookieTest1Servlet</servlet-name>
<servlet-class>com.mavenCookie.web.CookieTest1Servlet</servlet-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>CookieExtract</servlet-name>
<servlet-class>com.mavenCookie.web.CookieExtract</servlet-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>CookieAllRemove</servlet-name>
<servlet-class>com.mavenCookie.web.CookieAllRemove</servlet-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>CookieModify</servlet-name>
<servlet-class>com.mavenCookie.web.CookieModify</servlet-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>CookieTest1Servlet</servlet-name>
<url-pattern>/CookieTest1Servlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>CookieExtract</servlet-name>
<url-pattern>/CookieExtract</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>CookieAllRemove</servlet-name>
<url-pattern>/CookieAllRemove</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>CookieModify</servlet-name>
<url-pattern>/CookieModify</url-pattern>
</servlet-mapping>
</web-app>
파일명: web.xml
[첨부(Attachments)]
6. index.jsp
index.jsp 파일이다.
확인 기능을 손쉽게 할 수 있도록 구현하였다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>Cookie 태스트</title>
<style>
a{
text-decoration:none;
}
</style>
</head>
<body>
<h2>Hello World!</h2>
<h3>이클립스 웹에서는 확인 불가</h3>
<a href="CookieTest1Servlet">쿠키 생성</a><br/>
<a href="CookieExtract">쿠키 추출</a><br/>
<a href="CookieAllRemove">쿠키 전체 삭제</a><br/>
<a href="CookieModify">쿠키 변경(결론: 불가능)</a><br/>
<div style="width:400px; height:200px; background-color:#e2e2e2">
<h5>참고로 웹 브라우저에서 쿠키를 제거하는 옵션을 켜버리면 유지 자체에 의미가 없어짐.</h5>
</div>
</body>
</html>
파일명: insert.jsp
[첨부(Attachments)]
7. Servlet - CookieTest1Servlet
쿠키 생성 방법에 대한 소스이다.
package com.mavenCookie.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieTest1Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public CookieTest1Servlet() {
super();
}
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
ServletConfig sc = this.getServletConfig();
String charset = sc.getInitParameter("charset");
res.setContentType("text/html;charset=" + charset);
PrintWriter out = res.getWriter();
// 1. 쿠키 생성 - 기본 시간(브라우저 종료시 전송받은 쿠키 사라짐)
Cookie c1 = new Cookie("id", "userID");
c1.setPath("/");
res.addCookie(c1);
// 2. 쿠키 생성 - 쿠키 3시간 설정(60sec * 60Min * 3Hour)
Cookie c2 = new Cookie("mymy", "1234");
c2.setMaxAge(60 * 60 * 3);
c2.setPath("/");
res.addCookie(c2);
// 3. 쿠키 생성 - 쿠키 5일 설정(60sec * 60Min * 24Hour * 5Day)
Cookie c3 = new Cookie("subject", "zaza");
c3.setMaxAge(60 * 60 * 24 * 5);
c3.setPath("/"); // 경로는 루트로 지정함.
res.addCookie(c3);
out.println("쿠키 전송 완료<br/>");
out.println("<a href=\"index.jsp\">이전</a>");
out.close();
}
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
}
}
파일명: CookieTest1Servlet.java
[첨부(Attachments)]
8. Servlet - CookieExtract
쿠키 내용을 조회하는 방법에 관한 것이다.
package com.mavenCookie.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieExtract extends HttpServlet {
private static final long serialVersionUID = 1L;
public CookieExtract() {
super();
}
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
ServletConfig sc = this.getServletConfig();
String charset = sc.getInitParameter("charset");
res.setContentType("text/html;charset=" + charset);
PrintWriter out = res.getWriter();
Cookie[] list = req.getCookies();
// 삭제 여부 - 판별
if ( list != null ) {
out.print("유지 상태<br/>");
}else
{
out.print("삭제 완료<br/>");
}
// 쿠키 찾기(seq방식)
out.println("쿠키 검색1<br/>");
for ( int i = 0; list != null && i < list.length; i++ ) {
out.println( list[i].getName() + ":value=" + list[i].getValue() + "<br/>" );
}
// for 문 - 응용2
out.println("쿠키 검색2<br/>");
int i = 0;
for( Cookie cookie : list) {
out.println( list[i].getName() + ":value=" + list[i].getValue() + "<br/>" );
i++;
}
out.println("<a href=\"index.jsp\">이전</a>");
out.close();
}
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
}
}
파일명: CookieExtract.java
[첨부(Attachments)]
9. Servlet - CookieAllRemove
쿠키를 전체 삭제하는 방법이다.
package com.mavenCookie.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieAllRemove extends HttpServlet {
private static final long serialVersionUID = 1L;
public CookieAllRemove() {
super();
}
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
ServletConfig sc = this.getServletConfig();
String charset = sc.getInitParameter("charset");
res.setContentType("text/html;charset=" + charset);
PrintWriter out = res.getWriter();
Cookie[] list = req.getCookies();
for ( int i = 0; list != null && i < list.length; i++ ) {
// 만료처리 전
out.print( "이전 list[" + i + "]: " + list[i].getName() );
out.print( "<br/>" );
// 유효시간 0으로 설정하면 만료처리됨.
Cookie kc = new Cookie(list[i].getName(), null) ;
kc.setMaxAge(0) ;
kc.setPath("/");
// 응답에 쿠키 추가
res.addCookie(kc);
kc = null;
}
out.println("<br/>");
out.println("<a href=\"index.jsp\">이전</a>");
out.close();
}
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
}
}
파일명: CookieAllRemove.java
[첨부(Attachments)]
10. Servlet - CookieModify(안 되는 코드)
안 된다고 표기를 해둔 이유는 setValue 등으로 수정 후 넘기면 될 것 같지만, 전혀 되지 않는다.
package com.mavenCookie.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CookieModify
*/
public class CookieModify extends HttpServlet {
private static final long serialVersionUID = 1L;
public CookieModify() {
super();
}
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
ServletConfig sc = this.getServletConfig();
String charset = sc.getInitParameter("charset");
res.setContentType("text/html;charset=" + charset);
PrintWriter out = res.getWriter();
Cookie[] list = req.getCookies();
for ( Cookie cookie : list ) {
if ( cookie.getName().equals("id")) {
cookie.setValue("haha");
res.addCookie(cookie);
}
}
out.println("<br/>");
out.println("<a href=\"index.jsp\">이전</a>");
out.close();
}
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
}
}
파일명: CookieModify.java
[첨부(Attachments)]
* 맺음글(Conclusion)
쿠키 프로젝트로 가볍게 쿠키 사용 방법에 대해서 살펴보았다.
'소프트웨어(SW) > JSP' 카테고리의 다른 글
[JSP] 18. JSP/Servlet MVC2 - 페이징네이션과 검색 그리고 오라클 프로젝트 (2) (2) | 2020.09.30 |
---|---|
[JSP] 17. JSP/Servlet MVC2 - 페이징네이션과 검색 그리고 오라클 프로젝트 (1) (2) | 2020.09.30 |
[JSP] 15. Jsp/Servlet(MVC) - Session(세션) 프로젝트(로그인) - (2) (2) | 2020.09.25 |
[JSP] 14. Jsp/Servlet(MVC) - Session(세션) 프로젝트(로그인) - (1) (2) | 2020.09.25 |
[JSP] 13. Jsp/Servlet(MVC) Maven 기반의 다중 파일 업로드, 다운로드 구현(2) (2) | 2020.09.25 |