2-23 쿠키(Cookie)란?

서현우·2022년 5월 15일
0

스프링의정석

목록 보기
23/85

쿠키란?

이름과 값의 쌍으로 구성된 작은 정보. 아스키 문자만 가능.
서버에서 생성 후 전송, 브라우저에 저장. 유효기간 이후 자동 삭제.
서버에 요청시 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);
}

loginForm.jsp 추가

  1. EL을 사용해서 쿠키에 id값이 있으면 value에 저장.
  2. checkbox에 쿠키에 id값이 있으면 checked, 없으면 빈문자열
		<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>

LoginController.java

  1. id, pwd 확인해서 일치하지 않으면 loginForm으로 리다이렉트
  2. 일치하면
    2-1. rememberId가 true이면 쿠키를 생성해서 응답에 저장.
    2-2. rememberId가 false면 쿠키를 삭제.
  3. 홈으로 이동
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);
	}
}
profile
안녕하세요!!

0개의 댓글