코딩 노트

HTTP 쿠키(Cookie) 본문

Spring

HTTP 쿠키(Cookie)

newbyeol 2023. 10. 18. 11:23

HTTP 쿠키(Cookie)란?

- 클라이언트에 저장되는 key=value 데이터 저장소

- 보안과 별 상관없는 홈페이지의 정보를 저장하는 목적으로 사용

- 한글은 저장 불가하며, 오직 문자열만 저장 가능

- 크기 제한이 존재(256 byte)

spring19cookie 프로젝트 생성 후

properties 설정

# project setting file

# key=value

 

#sever setting

#server.servlet.context-path=/khacademy

##server.port=9999

 

#view resolver setting

spring.mvc.view.prefix=/WEB-INF/views/

spring.mvc.view.suffix=.jsp

 

 

# database setting

spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe

spring.datasource.username=C##home

spring.datasource.password=home

 

spring.datasource.hikari.data-source-properties.oracle.jdbc.timezoneAsRegion=false

 

# mybatis setting

mybatis.type-aliases-package=com.kh.spring19.dto,com.kh.spring19.vo

mybatis.mapper-locations=/mybatis/**/*-mapper.xml

mybatis.configuration.map-underscore-to-camel-case=true

 

#logging setting

logging.level.root=warn

logging.level.com.kh=debug

#logging.level.member=debug

 

logging.pattern.console=[%-5level] %msg - %c [%d{yyyy-MM-dd HH:mm:ss.S}] %n

 

# logging file setting

#logging.file.name= logs/server.log

#logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss.S} [%-5level] %msg - %c %n

#logging.logback.rollingpolicy.max-file-size=10MB

#logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}-%d{yyyy-MM-dd-HH}-%i.log

 

#custom properties setting

#custom.fileupload.home=C:/upload/profile

 

#email setting

#custom.email.host=smtp.gmail.com

#custom.email.port=587

#custom.email.username=qufquf12120

#custom.email.password=ajeprfgyoraxwuks

pom.xml 설정

<!-- 프로젝트에 JSP를 사용하기 위한 라이브러리(의존성) -->

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

</dependency>

<dependency>

<groupId>org.apache.tomcat.embed</groupId>

<artifactId>tomcat-embed-jasper</artifactId>

</dependency>

controller 패키지 생성 후 HomeController 클래스 생성

@Slf4j

@Controller

public class HomeController {

 

@RequestMapping("/")

public String home() {

return "home"; //기존

}

}

webapp 폴더 아래 WEB-INF 폴더 생성 후 views 생성 후 home.jsp 파일 생성

경로

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

 

<h1>쿠키 테스트</h1>

 

<%--

JSP에서는 EL을 이용하여 쿠키를 탐색할 수 있다.

EL의 내장객체 중에 cookie 라는 이름의 내장객체가 존재하며 이를 활용한다.

--%>

 

<h2>popup 쿠키 있나요? - ${cookie.popup != null}</h2>

home.jsp 수정

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

<h1>쿠키 테스트</h1>

 

<%--

JSP에서는 EL을 이용하여 쿠키를 탐색할 수 있다.

EL의 내장객체 중에 cookie 라는 이름의 내장객체가 존재하며 이를 활용한다.

--%>

 

<h2>popup 쿠키 있나요? - ${cookie.popup == null}</h2>

 

<%-- 쿠키가 있을 때만 나오는 화면 구현 --%>

<c:if test="${cookie.popup != null}">

<h2>팝업화면</h2>

</c:if>

 

<%-- saveId란 이름으로 아이디가 저장된 쿠키가 있을 경우 로그인 화면 --%>

<form action="" method="post">

<input type="text" name="memberId" value="${cookie.saveId.value}">

<br><br>

<input type="password" name="memberPw">

<br><br>

<%--

choose 안 쓰고 삼항 연산자로 하기

<input type="checkbox" name="remember" ${cookie.saveId !=null ? 'checked':''}> 아이디 저장하기

--%>

<c:choose>

<c:when test = "${cookie.saveId != null}">

<input type="checkbox" name="remember" checked> 아이디 저장하기

</c:when>

<c:otherwise>

<input type="checkbox" name="remember" > 아이디 저장하기

</c:otherwise>

</c:choose>

<br><br>

<button type="submit">로그인</button>

</form>

쿠키를 서버에서 발행하려면?

home.jsp 수정

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

<h1>쿠키 테스트</h1>

 

<%--

JSP에서는 EL을 이용하여 쿠키를 탐색할 수 있다.

EL의 내장객체 중에 cookie 라는 이름의 내장객체가 존재하며 이를 활용한다.

--%>

 

<h2>popup 쿠키 있나요? - ${cookie.popup != null}</h2>

 

<%-- 쿠키가 있을 때만 나오는 화면 구현 --%>

<c:if test="${cookie.popup != null}">

<h2>팝업화면</h2>

</c:if>

 

//추가

<h3><a href="create1">평생 안 보기</a></h3>

<h3><a href="create2">일주일 안 보기</a></h3>

<h3><a href="create3">하루 안 보기</a></h3>

<h3><a href="create4">오늘 안 보기</a></h3>

<h3><a href="delete">그냥 보기</a></h3>

 

<%-- saveId란 이름으로 아이디가 저장된 쿠키가 있을 경우 로그인 화면 --%>

<form action="" method="post">

<input type="text" name="memberId" value="${cookie.saveId.value}">

<br><br>

<input type="password" name="memberPw">

<br><br>

<%--

choose 안 쓰고 삼항 연산자로 하기

<input type="checkbox" name="remember" ${cookie.saveId !=null ? 'checked':''}> 아이디 저장하기

--%>

<c:choose>

<c:when test = "${cookie.saveId != null}">

<input type="checkbox" name="remember" checked> 아이디 저장하기

</c:when>

<c:otherwise>

<input type="checkbox" name="remember" > 아이디 저장하기

</c:otherwise>

</c:choose>

<br><br>

<button type="submit">로그인</button>

</form>

HomeController 클래스 수정

@Slf4j

@Controller

public class HomeController {

 

@RequestMapping("/")

public String home() {

return "home"; //기존

}

 

/*

* 쿠키는 HttpCookie 클래스의 객체로 생성

* 생성 시 다음 정보를 설정할 수 있다.

* - 이름(name), 값(value) 필수 설정

* - 만료시간(maxAge, 초), 발행경로(path) 선택 설정

*

* (중요) 사용자가 쿠키를 가지고 있어야 하므로 응답 객체에 탑재시켜야 한다.

*/

 

//평생 안 보기

@RequestMapping("/create1")

public String create1(HttpServletResponse response) {

//쿠키를 만듬

Cookie cookie = new Cookie("popup","false"); //값은 중요치 않고 유무만 중요함 그래서 그냥 false라는 문자열

cookie.setMaxAge(Integer.MAX_VALUE);

//사용자에게 보내줌

response.addCookie(cookie);

return "redirect:/";

}

 

//일주일 안 보기

@RequestMapping("/create2")

public String create2(HttpServletResponse response) {

//쿠키를 만듬

Cookie cookie = new Cookie("popup","false"); //값은 중요치 않고 유무만 중요함 그래서 그냥 false라는 문자열

cookie.setMaxAge(7 * 24 * 60 * 60);

//사용자에게 보내줌

response.addCookie(cookie);

return "redirect:/";

}

 

//하루 안 보기

@RequestMapping("/create3")

public String create3(HttpServletResponse response) {

//쿠키를 만듬

Cookie cookie = new Cookie("popup","false"); //값은 중요치 않고 유무만 중요함 그래서 그냥 false라는 문자열

cookie.setMaxAge(1 * 24 * 60 * 60);

//사용자에게 보내줌

response.addCookie(cookie);

return "redirect:/";

}

 

//오늘 안 보기

@RequestMapping("/create4")

public String create4(HttpServletResponse response) {

//쿠키를 만듬

Cookie cookie = new Cookie("popup","false"); //값은 중요치 않고 유무만 중요함 그래서 그냥 false라는 문자열

//현재 시간의 다음날 0시 0분 0초

LocalDateTime midnight = LocalDateTime.now().plusDays(1L).withHour(0).withMinute(0).withSecond(0);

LocalDateTime current = LocalDateTime.now();

int seconds = (int) ChronoUnit.SECONDS.between(current, midnight);

//자정-현재시각

cookie.setMaxAge(seconds);

//사용자에게 보내줌

response.addCookie(cookie);

return "redirect:/";

}

 

//쿠키는 삭제 명령이 없다. 대신 0초 뒤 소멸하게 만들면 삭제가 되는 효과가 발생

@RequestMapping("/delete")

public String delete(HttpServletResponse response) {

//쿠키를 만듬

Cookie cookie = new Cookie("popup","false"); //값은 중요치 않고 유무만 중요함 그래서 그냥 false라는 문자열

cookie.setMaxAge(0);

//사용자에게 보내줌

response.addCookie(cookie);

return "redirect:/";

}

}

HomeController 클래스에 로그인 부분 구문 추가

이렇게 하면 아이디 저장하기 체크 해제 후 새로고침을 하면 쿠키가 삭제되고 아이디가 입력칸에 뜨지 않는다.

@PostMapping("/login")

public String login(

HttpServletResponse response,

@RequestParam String memberId,

@RequestParam String memberPw,

@RequestParam(required = false) String remember //미체크시 null

// @RequestParam(required = "N") String remember //미체크시 N

) {

//쿠키 생성 조건 - 로그인 성공 후 아이디 저장하기를 체크한 경우

//쿠키 삭제 조건 - 로그인 성공 후 아이디 저장하기를 체크하지 않은 경우

 

//if(로그인 성공 시){

if(remember != null) { //아이디 저장하기를 체크했다면

Cookie cookie = new Cookie("saveId", memberId);

cookie.setMaxAge(4*7*24*60*60); //4주

response.addCookie(cookie); //쿠키 발행

}

else { //아이디 저장하기를 체크하지 않았다면

Cookie cookie = new Cookie("saveId", memberId);

cookie.setMaxAge(0); //발행 즉시 삭제

response.addCookie(cookie); //쿠키 발행

}

//}

return "redirect:/";

}