티스토리 뷰

쿠키란?

- 클라이언트 단에 저장되는 작은 정보 단위

- 쿠키는 Key와 Value 이렇게 하나의 정보를 가지고 있다.

- 굉장히 단순한 문자열로 된 자료들을 저장한다.

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

- 쿠키는 브라우저별로 제한 값을 다르게 가져가고 있다. 참조 : http://browsercookielimits.squawky.net/

서버 → 클라이언트 이용방법

- 서버에서 클라이언트의 브라우저로 전송돼서 사용자의 컴퓨터에 저장된다.

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

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

 

 

쿠키 객체 사용방법

서버에서 쿠키 생성

javax.servlet.http.Cookie

 

쿠키 생성 방식)

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

- 서버에서 쿠키 생성, ResponseaddCookie메소드를 이용해 클라이언트에게 전송한다.

- 웹 클라이언트는 이 쿠키를 만들어준 서버한테 다시 요청을 보내게 될 때 자동으로 해당 쿠키들을 같이 보낸다.

- 서버는 요청으로부터 전달된 쿠키를 읽어 들여서 사용을 하게 된다.

 

클라이언트가 보낸 쿠키 정보 읽기

사용형식)

1
Cookie[] cookies = request.getCookies();
cs

- 쿠키는 배열로 return이 된다. 즉 쿠키는 여러개일 수 있다.

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

- 그렇기 때문에 최초의 쿠키값 null에 대한 처리를 해주어야 NullPointerException이 발생하지 않는다.

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

클라이언트에게 쿠키 삭제 요청

사용형식)

1
2
3
Cookie cookie = new Cookie("이름"null);
cookie.setMaxAge(0);
response.addCookie(cookie);
cs

- 쿠키의 관리는 웹 클라이언트가 하기 때문에 삭제 할 수 있는 명령어는 없다.

- 쿠키를 삭제하는 명령은 없고, maxAge가 0인 같은 이름의 쿠키를 전송한다. 상태유지시간이 0인 쿠키가 생성된다.

- 같은 이름의 다른 값의 쿠키가 들어오면 클라이언트는 쿠키 자체를 교체한다.

- 유지시간이 0이기 때문에 교체된 해당 쿠키는 사라지게 된다.

 

쿠키의 유효기간 설정

메소드 setMaxAge()

- 인자는 유효기간을 나타내는 초단위의 정수형

- 만일 유효기간을 0으로 지정하면 쿠키의 삭제

- 음수를 지정하면 브라우저가 종료될 때 쿠키가 삭제

 

ex) 유효기간을 10분으로 지정하려면

-- cookie.setMaxAge(10 * 60); //초 단위 : 10분
- 1주일로 지정하려면 (7*24*60*60)

 

 

 

Spring MVC에서의 Cookie 사용

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

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

 

쿠키 이름

- 쿠키의 이름은 알파벳과 숫자로만 구성된다.

- 쿠키의 이름은 알파벳과 숫자로만 구성되고, 쿠키 값은 공백, 괄호, 등호, 콤마, 콜론, 세미콜론은 포함할 수 없다.

- 쿠키의 값을 한글로 저장하고 싶다면 인코딩해서 쿠키를 보내야하고, 받아온 쿠키는 다시 디코딩해서 봐야 한글의 값이 보인다.

 

 

 

쿠키를 이용한 상태정보 유지하기

*이전의 Guestbook 프로젝트에 이어서 진행

 

HttpServletRequest 이용

*GuestbookController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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.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,// HttpServletRequest 이용하여 쿠키 관련 작업을 한다.
                       HttpServletResponse response) {
 
        
        String value = null;
        boolean find = false;
        //원하는 쿠기 찾기
        Cookie[] cookies = request.getCookies();    // 클라이언트로부터 쿠키배열을 가져온다. 없다면 null을 리턴.
        if(cookies != null) {    //null에 대한 처리가 있어야 처음 들어왔을 때 NullPointException이 발생하지 않는다.
            for(Cookie cookie : cookies) {    //    각 쿠키들의 
                if("count".equals(cookie.getName())) {     //이름이 count와 같은지 확인
                    find = true;
                    value = cookie.getValue();
                    break;    //    찾으면 break;
                }
            }
        }
        
      
        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년 동안 유지. if -1로 설정해놓으면 브라우저를 닫으면 쿠키도 사라진다.
        cookie.setPath("/"); // '/' 경로 이하에 모두 쿠키 적용. 
        response.addCookie(cookie);    //    response. 새로 변경된 밸류를 가진 쿠키를 response에 담아 클라이언트로 보낸다.
                                    //    클라이언트는 똑같은 이름의 쿠기가 들어왔을 때, 기존의 쿠키와 교체한다.
        
        
        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";
    }
}
cs

 

 

@CookieValue 이용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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 = "0", required = trueString value, //// defaultValue : 쿠키가 없을
                                                                                                //// 때 최초로 지정할 값 설정
            HttpServletResponse response) {
 
        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년 동안 유지. if -1로 설정해놓으면 브라우저를 닫으면 쿠키도 사라진다.
        cookie.setPath("/"); // '/' 경로 이하에 모두 쿠키 적용.
        response.addCookie(cookie); // response. 새로 변경된 밸류를 가진 쿠키를 response에 담아 클라이언트로 보낸다.
                                    // 클라이언트는 똑같은 이름의 쿠기가 들어왔을 때, 기존의 쿠키와 교체한다.
 
        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";
    }
}
cs

 

 

참고 사이트 : http://www.edwith.org/



본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.

댓글