HTTP Cookie

Kevin·2024년 3월 5일
0

Network

목록 보기
6/15
post-thumbnail

쿠키(Cookie)란?

  • 이름과 값의 쌍으로 구성된 정보이며, 아스키 문자만 가능

    • Domain: fastcampus.co.kr
    • path: /ch2/login
    • id: asdf
    • Max-Age: 606024
  • 서버에서 생성 후에 응답 헤더에 담아서 전송, 브라우저에 저장, 유효기간 이후 자동 삭제

    • 쿠키는 서버에서 생성하는 것
  • 클라이언트에서 서버에 요청한 domain, path가 일치하는 경우에만 저장된 쿠키를 요청 헤더에 담아서 서버에 자동 전송

  • 하위 Path에도 쿠키가 자동 전송된다.
  • 클라이언트 식별 기술이다.


쿠키 생성

Cookie cookie = new Cookie("id", "Kevin"); // 쿠키 생성
cookie.setMaxAge(60*60*24);                // 유효기간 설정(초)
cookie.setDomain("localhost");             // 쿠키의 도메인 설정
cookie.setPath("/");                       // 쿠키의 주소를 설정
response.addCookie(cookie);                // 응답에 쿠키 추가
  • Cookie("id", "Kevin") ← “id”는 key, “Kevin”는 value이다.
  • 도메인 : 현재 쿠키가 어떤 서버로 전송되어져야 하는지 지정하는 속성.
  • path : path로 지정한 곳에서 쿠키 데이터를 읽을 수 있음. 디폴트 값으로 쿠키를 생성한 곳에서만 쿠키를 읽을 수 있게 되어있음.
    • 쿠키 주소 ← 브라우저는 해당 주소에 접근할 때 서버에 해당 쿠키를 자동으로 보낸다.
@RequestMapping("/createCookie")
	public String createCookie(HttpServletResponse response) {
		Cookie cookie = new Cookie("useremail","blueskii");
		cookie.setDomain("localhost");
		cookie.setPath("/");
		// 30초간 저장
		cookie.setMaxAge(30*60);
		cookie.setSecure(true);
		response.addCookie(cookie);
		
		return "redirect:/ch05/content";
	}

쿠키 삭제와 변경

"""
	쿠키 삭제
"""

Cookie cookie = new Cookie("id", "Kevin"); // 삭제할 쿠키와 같은 이름의 쿠키 생성
cookie.setMaxAge(0);                // 유효기간을 0으로 설정(삭제)
response.addCookie(cookie);                // 응답에 쿠키 추가

"""
	쿠키 변경
"""
Cookie cookie = new Cookie("id", "Kevin"); // 변경할 쿠키와 같은 이름의 쿠키 생성
cookie.setValue();                         // setter로 변경할 값 넣어주기
cookie.setDomain();
cookie.setPath();
cookie.setMaxAge();
response.addCookie(cookie);                // 응답에 쿠키 추가
  • 유효기간이 지난 쿠키는 자동으로 폐기된다. ← 이를 이용해서 삭제를 한다.

쿠키 읽어오기

  1. 어노테이션으로 가져오는 방법

    @RequestMapping("/getCookie1")
    	public String getCookie1(@CookieValue String useremail, @CookieValue("useremail") String umail) {
    		logger.info("실행");
    		logger.info(umail);
    		return "redirect:/ch05/content";
    	}

  1. httpServletRequest 객체로 가져오는 방법

    @RequestMapping("/getCookie2")
    	public String getCookie2(HttpServletRequest request) {
    		Cookie[] list = request.getCookies();
    		for(Cookie cookie:list) {
    			if(cookie.getName().equals("useremail")) {
    				logger.info(cookie.getValue());
    			}
    		}
    		return "redirect:/ch05/content";
    	}
    """
    	쿠키 읽어오기
    """
    
    Cookie[] cookies = request.getCookies();
    
    for(Cookie cookie : cookies) {
    	String name = cookie.getName();
    	String value = cookie.getValue();
    }
<br />

쿠키를 이용해서, 로그인 아이디를 기억하는 방법

@PostMapping("/login")
	public String login(String id, String pwd, boolean rememberId, HttpServletResponse response) throws Exception {
		System.out.println("id="+id);
		System.out.println("pwd="+pwd);
		System.out.println("rememberId="+rememberId);
		// 1. id와 pwd를 확인
		if(!loginCheck(id, pwd)) {
			// 2-1   일치하지 않으면, loginForm으로 이동
			String msg = URLEncoder.encode("id 또는 pwd가 일치하지 않습니다.", "utf-8");
			
			return "redirect:/login/login?msg="+msg;
		}
		
		// 2-2. id와 pwd가 일치하면,
		if(rememberId) {
		//     1. 쿠키를 생성
			Cookie cookie = new Cookie("id", id); // ctrl+shift+o 자동 import
//		       2. 응답에 저장
			response.addCookie(cookie);
		} else {
// 		       1. 쿠키를 삭제
			Cookie cookie = new Cookie("id", id); // ctrl+shift+o 자동 import
			cookie.setMaxAge(0); // 쿠키를 삭제
//		       2. 응답에 저장
			response.addCookie(cookie);
		}
//		3. 홈으로 이동
		return "redirect:/";
	}

	private boolean loginCheck(String id, String pwd) {
		return "asdf".equals(id) && "1234".equals(pwd);
	}
}
  • 기능 구현시 먼저 기능의 최종 결과를 먼저 만들어보고, 해당 최종 결과를 어떻게 구현할 수 있을지를 생각해보자.



쿠키 대신 JWT를 사용하는 이유는 보안에 의해서인가?

쿠키의 문제점

  • Cookie가 노출되었을 때 ID, PW와 같은 중요정보들이 쉽게 노출된다.
    • JWT는 private Clain으로 감출 수 있다.
  • 웹 브라우저마다 Cookie에 대한 지원 형태가 다르기 때문에 브라우저간 공유가 불가능하다.
    • 브라우저간 공유가 가능하다.
  • Cookie의 사이즈는 4KB로 제한되어 많은 양의 데이터를 담을 수 없다.
    • JWT의 사이즈 제한은 7Kb이다.
profile
Hello, World! \n

0개의 댓글