이름과 값의 쌍으로 구성된 작은 정보. 아스키 문자만 가능.
서버에서 생성 후 전송, 브라우저에 저장. 유효기간 이후 자동 삭제.
서버에 요청시 domain, path가 일치하는 경우에만 자동 전송.
name=value //이름과 값의 쌍
Max-Age:60*60*24 //유효기간
클라이언트에서 서버로 요청이 가면
Cookie cookie = new Cookie("id", "asdf");
response.addCookie(cookie);
//응답헤더에 'Set-Cookie: id=asdf' 1줄 추가해서 클라이언트로 쿠키를 전달.
//클라이언트에 쿠키가 저장.
//클라이언트가 서버로 요청을 하게되면, 쿠키가 자동으로 요청과 함께 가게 됨.
//(요청헤더에 쿠키가 따라간다.)
//==> 클라이언트 식별 기술
Cookie cookie = new Cookie("id","asdf"); //쿠키 생성
cookie.setMaxAge(60*60*24); //유효기간 설정(초)
response.addCookie(cookie); //응답에 쿠키 추가
//==> 아래 한줄이 응답에 추가됨.
Set-Cookie: id=asdf; Max-Age=86400; Expires=Tue, ...
//쿠키의 삭제
Cookie cookie = new Cookie("id"); //변경할 쿠키와 같은 이름의 쿠키 생성
cookie.setMaxAge(0); //유효기간을 0으로 설정(삭제)
response.addCookie(cookie); //응답에 쿠키 추가
//쿠키의 변경
Cookie cookie = new Cookie("id"); //변경할 쿠키와 같은 이름 쿠키 생성.
cookie.setValue(URLEncoder.encode("서현우")); //값의 변경
cookie.setDomain("www.fastcampus.co.kr"); //도메인의 변경
cookie.setPath("/ch2"); //경로의 변경
cookie.setMaxAge(60*60*24*7); //유효기간의 변경
response.addCookie(cookie); //응답에 쿠키 추가
Cookie[] cookies = request.getCookies(); //쿠키 읽기
for(Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.printf("[cookie]name=%s, value=%s%n", name, value);
}
<input type="text" name="id" value="${cookie.id.value}" placeholder="이메일 입력" autofocus>
<input type="password" name="pwd" placeholder="비밀번호">
<button>로그인</button>
<div>
<label><input type="checkbox" name="rememberId" ${empty cookie.id.value ? "" : "checked"}> 아이디 기억</label> |
<a href="">비밀번호 찾기</a> |
<a href="">회원가입</a>
</div>
package com.fastcampus.ch2;
import java.net.URLEncoder;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/login")
public class LoginController {
@GetMapping("/login")
public String loginForm() {
return "loginForm";
}
@PostMapping("/login")
public String login(String id, String pwd, boolean rememberId, HttpServletResponse response) throws Exception {
//1. id와 pwd를 확인
if(!loginCheck(id, pwd)) {
// 일치하지 않으면, loginForm으로 이동
String msg = URLEncoder.encode("id 또는 pwd가 일치하지 않습니다.", "utf-8");
return "redirect:/login/login?msg="+msg;
}
//2-1. id와 pwd가 일치하면,
if(rememberId) {
//쿠키를 생성
//1. 쿠키를 생성
Cookie cookie = new Cookie("id",id);
//2. 응답에 저장
response.addCookie(cookie);
} else {
//2-2. 일치하지 않으면 쿠키를 삭제
Cookie cookie = new Cookie("id",id);
cookie.setMaxAge(0); //쿠키를 삭제
response.addCookie(cookie);
}
//3. 홈으로 이동
return "redirect:/";
}
private boolean loginCheck(String id, String pwd) {
return "asdf".equals(id) && "1234".equals(pwd);
}
}