ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Back End] 상태유지기술 - Cookie
    Web Development/부스트코스 - Back-End(Java) 2020. 5. 11. 23:35

    ✔️ 웹에서의 상태 유지 기술

     HTTP 프로토콜은 상태 유지가 안되는 프로토콜이다.

      - 클라이언트가 이전에 무엇을 했고, 지금 무엇을 했는지에 대한 정보를 가지고 있지 않다.

      - 웹 브라우저(클라이언트)의 요청에 대한 응답을 하고 나면 해당 클라이언트와의 연결을 지속하지 않는다.

     클라이언트의 상태 정보 유지를 위해 Cookie와 Session 기술이 등장했다.


    ✔️ Cookie (쿠키)

     

    쿠키 동작 이해 1/2

     

    쿠키 동작 이해 2/2

    📋 정의

    ◾ 클라이언트 단에 저장되는 작은 정보의 단위이다.

    ◾ 클라이언트에서 생성하고 저장될 수 있고, 서버 단에서 전송한 쿠키가 클라이언트에 저장될 수 있다.

     

    📋 사용 방법

    ◾ 서버에서 클라이언트의 브라우저로 전송되어 사용자 컴퓨터에 저장한다.

    ◾ 저장된 쿠키는 다시 해당하는 웹 페이지에 접속할 때, 브라우저에서 서버로 쿠키를 전송한다.

    ◾ 쿠키는 이름(name)과 값(value) 쌍으로 정보를 저장한다.

    ◾ 이름-값 쌍 외에도 도메인(Domain), 경로(Path), 유효기간(Max-Age, Expires), 보안(Secure), HttpOnly 속성을 저장할 수 있습니다.

     

    📋 쿠키는 수와 크기에 제한이 있다.

    브라우저별로 제한 값을 다르게 가져가고 있다.

     

    📋 javax.servlet.http.Cookie

    🍪 쿠키 생성

    ◾ 서버에서 아래와 같이 쿠키를 생성할 수 있다. Reponse의 addCookie 메소드를 이용해 클라이언트에게 전송

    ◾ 쿠키는 (이름, 값)의 쌍 정보를 입력하여 생성한다.

    ◾ 쿠키의 이름은 일반적으로 알파벳과 숫자, 언더바로 구성한다. 

    Cookie cookie = new Cookie(이름, 값);
    response.addCookie(cookie);

    🍪 쿠키 읽기

    ◾ 쿠키 값이 없으면 null이 반환된다.

    ◾ Cookie가 가지고 있는 getName()과 getValue() 메소드를 사용해서 원하는 쿠키정보를 찾아 사용한다. 

    🍪 쿠키 삭제

    maxAge가 0인 같은 이름의 쿠키를 전송하여 클라이언트 단의 쿠키를 삭제한다. 

    Cookie cookie = new Cookie("이름", null);
    cookie.setMaxAge(0);
    response.addCookie(cookie);

    🍪 쿠키 유효기간 설정 

     메소드 setMaxAge()
    - 인자는 유효기간을 나타내는 초 단위의 정수형
    - 만일 유효기간을 0으로 지정하면 쿠키의 삭제
    - 음수를 지정하면 브라우저가 종료될 때 쿠키가 삭제

     

     유효기간을 10분으로 지정하려면
    - cookie.setMaxAge(10 * 60); //초 단위 : 10분
    - 1주일로 지정하려면 (7*24*60*60)로 설정합니다.

     

    🍪 javax.servlet.http.Cookie 정리

     

    javax.servlet.http.Cookie

     

    📋 Spring MVC에서의 Cookie 사용

    @CookieValue 애노테이션 사용
    - 컨트롤러 메소드의 파라미터에서 CookieValue애노테이션을 사용함으로써 원하는 쿠키정보를 파라미터 변수에 담아 사용할 수 있다.

     

     컨트롤러메소드(@CookieValue(value="쿠키이름", required=false, defaultValue="기본값") String 변수명)


    ✔️ 쿠키 실습

    💾 GuestbookController.java

    더보기
    package kr.or.connect.guestbook.controller;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.CookieValue;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import kr.or.connect.guestbook.dto.Guestbook;
    import kr.or.connect.guestbook.service.GuestbookService;
    
    @Controller
    public class GuestbookController {
    	@Autowired
    	GuestbookService guestbookService;
    
    	@GetMapping(path="/list")
    	public String list(@RequestParam(name="start", required=false, defaultValue="0") int start,
    					   ModelMap model,
                           HttpServletRequest request,
    					   HttpServletResponse response) {
    
            
    		String value = null;
    		boolean find = false;
    		Cookie[] cookies = request.getCookies();
    		if(cookies != null) {
    			for(Cookie cookie : cookies) {
    				if("count".equals(cookie.getName())) {
    					find = true;
    					value = cookie.getValue();
    				}
    			}
    		}
    		
          
    		if(!find) {
    			value = "1";
    		}else { // 쿠키를 찾았다면.
    			try {
    				int i = Integer.parseInt(value);
    				value = Integer.toString(++i);
    			}catch(Exception ex) {
    				value = "1";
    			}
    		}
    		
       
    		Cookie cookie = new Cookie("count", value);
    		cookie.setMaxAge(60 * 60 * 24 * 365); // 1년 동안 유지.
    		cookie.setPath("/"); // / 경로 이하에 모두 쿠키 적용. 
    		response.addCookie(cookie);
    		
    		
    		List<Guestbook> list = guestbookService.getGuestbooks(start);
    		
    		int count = guestbookService.getCount();
    		int pageCount = count / GuestbookService.LIMIT;
    		if(count % GuestbookService.LIMIT > 0)
    			pageCount++;
    		
    		List<Integer> pageStartList = new ArrayList<>();
    		for(int i = 0; i < pageCount; i++) {
    			pageStartList.add(i * GuestbookService.LIMIT);
    		}
    		
    		model.addAttribute("list", list);
    		model.addAttribute("count", count);
    		model.addAttribute("pageStartList", pageStartList);
    		model.addAttribute("cookieCount", value); // jsp에게 전달하기 위해서 쿠키 값을 model에 담아 전송한다.
    		
    		return "list";
    	}
    	
    	@PostMapping(path="/write")
    	public String write(@ModelAttribute Guestbook guestbook,
    						HttpServletRequest request) {
    		String clientIp = request.getRemoteAddr();
    		System.out.println("clientIp : " + clientIp);
    		guestbookService.addGuestbook(guestbook, clientIp);
    		return "redirect:list";
    	}
    }

    💾 list.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>방명록 목록</title>
    </head>
    <body>
    
    	<h1>방명록</h1>
    	<br> 방명록 전체 수 : ${count }, 방문한 수 : ${cookieCount }
    	<br>
    	<br>
    
    
    	<c:forEach items="${list}" var="guestbook">
    
    ${guestbook.id }<br>
    ${guestbook.name }<br>
    ${guestbook.content }<br>
    ${guestbook.regdate }<br>
    		<c:if test="${sessionScope.isAdmin == 'true'}">
    			<a href="delete?id=${guestbook.id}">삭제</a>
    			<br>
    			<br>
    		</c:if>
    	</c:forEach>
    	<br>
    
    	<c:forEach items="${pageStartList}" var="pageIndex" varStatus="status">
    		<a href="list?start=${pageIndex}">${status.index +1 }</a>&nbsp; &nbsp;
    </c:forEach>
    
    	<br>
    	<br>
    	<form method="post" action="write">
    		name : <input type="text" name="name"><br>
    		<textarea name="content" cols="60" rows="6"></textarea>
    		<br> <input type="submit" value="등록">
    	</form>
    </body>
    </html>

     


    ✔️ 쿠키 실습 - Spring MVC @CookieValue 사용

    💾 GuestbookController.java

    더보기
    package kr.or.connect.guestbook.controller;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.CookieValue;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import kr.or.connect.guestbook.dto.Guestbook;
    import kr.or.connect.guestbook.service.GuestbookService;
    
    @Controller
    public class GuestbookController {
    	@Autowired
    	GuestbookService guestbookService;
    
      	@GetMapping(path="/list")
    	public String list(@RequestParam(name="start", required=false, defaultValue="0") int start,
    					   ModelMap model, @CookieValue(value="count", defaultValue="1", required=true) String value,
    					   HttpServletResponse response) {
    		
            // 쿠키 값을 1증가 시킨다.
    		try {
    			int i = Integer.parseInt(value);
    			value = Integer.toString(++i);
    		}catch(Exception ex){
    			value = "1";
    		}
    		
            // 쿠키를 전송한다.
    		Cookie cookie = new Cookie("count", value);
    		cookie.setMaxAge(60 * 60 * 24 * 365); // 1년 동안 유지.
    		cookie.setPath("/"); // / 경로 이하에 모두 쿠키 적용. 
    		response.addCookie(cookie);
    		
    		List<Guestbook> list = guestbookService.getGuestbooks(start);
    		
    		int count = guestbookService.getCount();
    		int pageCount = count / GuestbookService.LIMIT;
    		if(count % GuestbookService.LIMIT > 0)
    			pageCount++;
    		
    		List<Integer> pageStartList = new ArrayList<>();
    		for(int i = 0; i < pageCount; i++) {
    			pageStartList.add(i * GuestbookService.LIMIT);
    		}
    		
    		model.addAttribute("list", list);
    		model.addAttribute("count", count);
    		model.addAttribute("pageStartList", pageStartList);
    		model.addAttribute("cookieCount", value); // 쿠키를 추가한다.
    		
    		return "list";
    	}
    	
    	@PostMapping(path="/write")
    	public String write(@ModelAttribute Guestbook guestbook,
    						HttpServletRequest request) {
    		String clientIp = request.getRemoteAddr();
    		System.out.println("clientIp : " + clientIp);
    		guestbookService.addGuestbook(guestbook, clientIp);
    		return "redirect:list";
    	}
    }

    댓글

Designed by Tistory.