코딩 노트
HTTP 쿠키(Cookie) 본문
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:/";
}
'Spring' 카테고리의 다른 글
웹소켓 - 실시간 채팅, 반응형 디자인 (0) | 2023.10.23 |
---|---|
실시간 채팅(WebSocket) (0) | 2023.10.20 |
myBatis04 - 암호화 로그인 + view resolver + 회원가입 축하 이메일 (0) | 2023.10.17 |
myBatis03 - 멤버 복합검색 + 암호화 (0) | 2023.10.16 |
myBatis02 - book 복합검색 + 화면 구현 (0) | 2023.10.13 |