Spring/공부

[Spring MVC] 쿠키 알아보기

하루인생 2021. 2. 8. 22:35

웹에서 상태를 유지시키기 위해서 쿠키(Cookie)와 세션(Session)을 사용한다.  

Http프로토콜을 사용하면 상태유지가 안되는데 이를 보완하기 위해서 이 기술들이 나타났다.

 

쿠키

 

사용자의 컴퓨터에 저장되며 유효시간의 지나면 사라진다.

사용자의 컴퓨터에 저장되기 때문에 다른 사람이 볼 수 있는 단점이 있다.

쿠키는 키와 값으로 이루어져있다. (물론 경로, 유효기간 등 을 저장할 수도 있다.)

브라우저는 각 웹사이트 당 20개의 쿠키를 허용한다.

또 모든 웹사이트를 합쳐 최대 300개 까지 허용한다.

 

처음에 요청이 들어오면 was에서 쿠키를 생성하여 클라이언트에 응답으로 보낸다. ( response.addCookie() )

이후 클라이언트가 쿠키를 가지게되고 이후 요청이 있을 때 마다 쿠키를 포함해서 요청한다. (자동으로 쿠키를 보낸다.)

was는 쿠키가 포함된 요청을 받게 되면 그 쿠키를 분석한다. ( request.getCookies() )

 

출처: www.javatpoint.com/cookies-in-servlet

 

Cookies in Servlet - javatpoint

Cookies in Servlet with examples on request dispatcher, session tracking, cookies, file upload, file download, crud, registration, login logout etc.

www.javatpoint.com

 

쿠키 사용법

 

요청과 응답을 하기 위해서 HttpServletRequest, HttpServletResponse 클래스를 사용한다.

...

@Controller
public class ListController {
	@Autowired
	StudentService service;
	
	@GetMapping(path = "/list")
	public String list(@RequestParam(name = "start",required = false, defaultValue = "0")Integer start,
			ModelMap model, HttpServletRequest request, HttpServletResponse response) {
		
        // 요청에서 쿠키를 받아온다. 
        // 여러 개의 쿠키를 받아올 수 있기 때문에 배열로 받는다.
        Cookie[] cookies = request.getCookies();
		String value = null;
		Boolean find = false;
		
        // request에서 쿠키를 보내지 않았으면 cookies배열은 null이다.(체크)
		if(cookies != null) {
			for(Cookie cookie: cookies) {
            // 이름(키)이 num인 쿠키가 있는지 확인하고 있으면 find에 true반환 
				if("num".equals(cookie.getName())) {
					find = true;
					value = cookie.getValue();
					break;
				}
			}
		}
		
        // find가 false라는 것은 브라우저에서 처음으로 요청한 상태이므로
        // value에 1을 대입
		if(!find) {
			value = "1";
		}else {
			value = String.valueOf((Integer.parseInt(value)+1));
		}
		
        // 쿠키를 생성(기존에 이미 쿠키가 있는 경우라도 생성해줘서 초기화해준다.)
		Cookie cookie = new Cookie("num", value);
		cookie.setMaxAge(60*10); // 10분
		cookie.setPath("/");
		response.addCookie(cookie); // 응답에 쿠키를 붙여서 전송 
		
		List<Student> list = service.getStudentList(start);
		
		int totalnum = service.totalCount();
		model.addAttribute("totalnum", totalnum);
		model.addAttribute("list",list);
		model.addAttribute("num",value); // 조회수를 나타내는 value를 modelMap에 삽입
		return "list";
	}
}

 

@CookieValue애노테이션 사용하기

 

@CookieVlalue애노테이션을 사용하면 코드가 더 간단해진다.

쿠키의 유무를 판단할 필요가 없고 쿠기가 없을 시 default 값을 설정할 수 있다.

또 요청으로부터 쿠키를 찾을 필요가 없으니 HttpServletRequest 객체를 사용하지 않아도 된다. 

...

@Controller
public class ListController {
	@Autowired
	StudentService service;
	
	@GetMapping(path = "/list")
	public String list(@RequestParam(name = "start",required = false, defaultValue = "0")Integer start,
			ModelMap model, @CookieValue(value = "num", defaultValue = "0", required = true)String value, HttpServletResponse response) {
		
		value = String.valueOf((Integer.parseInt(value)+1));
		
		Cookie cookie = new Cookie("num", value);
		cookie.setMaxAge(60*10);
		cookie.setPath("/");
		response.addCookie(cookie);
		
		List<Student> list = service.getStudentList(start);
		int totalnum = service.totalCount();
		model.addAttribute("totalnum", totalnum);
		model.addAttribute("list",list);
		model.addAttribute("num",value);
		return "list";
	}
    ...
}

 

 

 

 

좀 더 찾아볼 것

-> @CookiValue에서 파라미터로 왜 name을 안쓰고 value를 썼을까?