웹은 HTTP 프로토콜로 통신한다.
HTTP는 무상태 프로토콜이어서 서버는 클라이언트의 이전 상태를 기억하지 못한다.
(더 자세한 내용: 웹이 동작하는 법 (HTTP 프로토콜의 이해) )
하지만 상황에 따라 클라이언트의 이전 상태를 기억하고 있어야 하기도 하는데, 바로 이럴 때 쿠키라는 기술이 필요하다.
1. 쿠키(Cookie)란?
쿠키는 클라이언트 단에 저장되는 작은 정보의 단위이다.
클라이언트에서 생성하고 저장된다. 서버에서 전송한 쿠키가 클라이언트에 저장될 수 있다.
- 쿠키 이용 흐름
서버에서 쿠키 객체를 생성한 후, 응답과 함께 클라이언트의 브라우저로 전송되어, 사용자의 컴퓨터에 서버별로 저장된다.
저장된 쿠키는 다시 해당하는 웹 페이지에 접속할 때(서버한테 다시 요청 보낼 때) 브라우저에서 서버로 전송된다.
쿠키는 이름(name)과 값(value) 쌍으로 정보를 저장한다. (단순한 문자열로 된 데이터다.)
(이름-값 쌍 외에도 도메인, 경로, 유효기간, 보안, HttpOnly 속성을 저장할 수 있다.)
쿠키의 이름은 알파벳과 숫자로만 구성이 된다.
쿠키 값을 한글로 저장하고 싶다면 인코딩, 디코딩 과정이 필요하다.
쿠키의 크기는 브라우저별로 제한되는 값이 다르다.
참고로, 쿠키는 사용자 컴퓨터에 저장되는 만큼 다른 사람이나 시스템이 볼 수 있다는 단점이 있다.
2. 쿠키 사용 방법
javax.servlet.http.Cookie를 이용하여 쿠키를 생성하고 전송하고 삭제하는 방법
1) 서버에서 Response의 addCookie 메서드를 사용하여 쿠키를 클라이언트에게 전송한다.
Cookie cookie = new Cookie(이름, 값); //쿠키 생성
response.addCookie(cookie); //쿠키 전송
쿠키의 이름은 일반적으로 알파벳, 숫자, 언더바(_)로 구성한다.
※참고: RFC 6265 문서의 [4.1.1 Syntax] 항목
2) 서버에서 Request의 getCookie 메서드로 클라이언트가 보낸 쿠키 정보 읽기
Cookie[] cookies = request.getCookies();
쿠키 값이 없으면 null이 반환된다. (NullPointerException 같은 오류들 발생하지 않게 주의하기!)
하나의 서버에서 여러 개의 쿠키를 보낼 수 있어, getCookie 메서드의 리턴 타입은 배열로 되어 있다.
getName(), getValue()하는 메서드를 이용하여 원하는 쿠키 정보를 찾아올 수 있다.
setValue(String newValue)로 쿠키의 새로운 값을 설정할 수도 있다.
3) 서버에서 클라이언트에게 쿠키 삭제 요청하기
Cookie cookie = new Cookie("이름", null);
cookie.setMaxAge(0);
response.addCookie(cookie);
서버에서 쿠키를 삭제할 수는 없다. 쿠키는 클라이언트에서 관리하기 때문이다.
대신 클라이언트에 똑같은 이름의 쿠키를 또 만들 수 없다는 점을 이용한다.
삭제하려는 쿠키와 같은 이름의 쿠키를 생성하고, setMaxAge 메서드로 유효기간을 0으로 지정하여 클라이언트에게 보낸다.
그럼 기존의 쿠키가 새로 받은 쿠키로 바뀌고, 새 쿠키의 유효기간은 0이므로 바로 사라지게 된다.
setMaxAge 메서드의 인자는 유효기간을 나타내는 초 단위의 정수형이다.
음수이면 브라우저가 종료될 때 쿠키가 삭제된다.
3. Spring MVC에서 Cookie 사용 방법
@CookieValue 애노테이션 사용
컨트롤러 메소드의 파라미터에서 CookieValue 애노테이션을 사용하여, 원하는 쿠키 정보를 파라미터 변수에 담아 사용할 수 있다.
컨트롤러 메소드(@CookieValue(value="쿠키이름", required=false, defaultValue="기본값") String 변수명)
출처)
edwith 부스트코스 웹 프로그래밍
- 쿠키란?
'JAVA' 카테고리의 다른 글
로깅에 대하여 (0) | 2019.09.12 |
---|---|
enum으로 코드 줄이기 (0) | 2019.09.04 |
아규먼트 리졸버(Argument Resolver) (0) | 2019.08.26 |
인터셉터(Interceptor) - Cotroller 공통 로직 처리하기 (0) | 2019.08.26 |
세션(Session) 이용하는 방법 (5) | 2019.08.26 |
댓글