1️⃣ 쿠키
로그인 한 후 새로고침하면 로그인이 풀리지 않도록 어떠한 조치를 취해야 하는데,
그것이 바로 “Cookie”이다
2️⃣ 쿠키란?
: 웹 서버가 웹 브라우저에게 보냈다가 요청이 있을 때 저장되었다가 브라우저가 다시 서버로 보내주는 문자열 정보, 단순한 key-value 쌍이다.
쿠키의 위치
요청 시 : request.headers.cookie
응답 시 : response.writeHead
쿠키의 속성(attributes)
서버가 쿠키를 생성할 때, setCookie 함수를 사용하는데, Name, Value, Expires는 꼭 명시해야 한다!
쿠키 생성(구현)
@RequestMapping(value = path + "/login", method = RequestMethod.POST)
public String login(Model model, final HttpSession session,
HttpServletResponse response,
@ModelAttribute LoginInfo loginInfo)
{
System.out.println(loginInfo.getId() + ", " +
loginInfo.getPassword() + ", " +
loginInfo.isStoreId());
// 로그인 정보 확인
UserDTO userDTO = userService.loginVerification(loginInfo.getId(), loginInfo.getPassword());
if(userDTO == null) {
model.addAttribute("errStr", "로그인 실패: 아이디 및 패스워드를 확인 해주세요.");
return "redirect:/login_page";
}
// 쿠키 생성 및 설정
if(loginInfo.isStoreId())
{
// 쿠키 객체 생성
Cookie storeIdCookie = new Cookie("storeIdCookie", loginInfo.getId());
// 쿠키 path 설정
storeIdCookie.setPath(path + "/login_page");
// 쿠키 유효기간 설정
storeIdCookie.setMaxAge(60 * 60 * 24 * 30);
// 쿠키 객체를 response에 넣어서 보냄
response.addCookie(storeIdCookie);
}
// 세션 설정
session.setAttribute(UserConfig.SESS_USER_UID, userDTO.getUid());
session.setAttribute(UserConfig.SESS_USER_ID, userDTO.getId());
session.setAttribute(UserConfig.SESS_USER_NAME, userDTO.getNickname());
// expired in 10 minutes
session.setMaxInactiveInterval(60 * 10);
return "redirect:/";
}
쿠키 사용
@RequestMapping(value = path + "/login_page", method = RequestMethod.GET)
public String loginPage(Model model,
@CookieValue(value="storeIdCookie", required = false) Cookie storeIdCookie)
{
LoginInfo loginInfo = new LoginInfo();
if (storeIdCookie != null) // 쿠키가 null이 아니면
{
loginInfo.setId(storeIdCookie.getValue()); // loginInfo의 멤버 변수를 쿠키의 내용으로 바꾼다.
loginInfo.setStoreId(true);
}
model.addAttribute("loginInfo", loginInfo);
return "login_page";
}
@CookieValue(”key”)
: 이 애노테이션을 붙인 변수를 파라미터로 넘기면 스프링이 해당 키 값을 가진 쿠키 값을 변수에 할당해 준다.
- Value : cookie의 이름
- required : 이 쿠키가 반드시 존재해야 하는지 여부
<h1>Login</h1>
<p>Please enter ID & password</p>
<!--/*@thymesVar id="errStr" type="java.lang.String"*/-->
<div th:if="${errStr != null}" th:text="${errStr}"></div>
<!--/*@thymesVar id="loginInfo" type="com.board.dtos.LoginInfo"*/-->
<form action="#" th:action="@{/user/login}" th:object="${loginInfo}" method="post">
ID: <br/>
<input type="text" th:field="*{id}" th:value="*{id}"/><br/>
Password: <br/>
<input type="password" th:field="*{password}"/><br/>
<input type="checkbox" th:field="*{storeId}" th:checked="*{storeId}"/>ID 저장
<br/><br/>
<input type="submit" value="Login"/>
</form>
- LoginInfo 객체를 controller로부터 넘겨 받아서 ID 입력 textbox와 ID 저장 checkbox에 멤버변수를 대입한다.
@RequestMapping(value="/some/path", method = RequestMethod.POST)
public void ResponseEntity<?> someMethod(HttpServletRequest request) {
Cookie[] myCookies = request.getCookies(); // Request 속 쿠키를 리스트에 넣기
for(int i = 0; i < myCookies.length; i++) {
System.out.println(i + "번째 쿠키 이름: " + myCookies[i].getName());
System.out.println(i + "번째 쿠키 값: " + myCookies[i].getValue());
}
}
쿠키를 가져올 땐 HttpServletRequest 에서 가져오고, 설정할 땐 HttpServletRequest로 설정한다.
쿠키 제거
@RequestMapping(value="/some/path", method = RequestMethod.POST)
public void ResponseEntity<?> someMethod(HttpServletResponse response) {
//원래 쿠키의 이름이 userInfo 이었다면, value를 null로 처리.
Cookie myCookie = new Cookie("userInfo", null);
myCookie.setMaxAge(0); // 쿠키의 expiration 타임을 0으로 하여 없앤다.
myCookie.setPath("/"); // 모든 경로에서 삭제 됬음을 알린다.
response.addCookie(myCookie);
}