COOKIE와 세션SESSION 필요성은
HTTP의 특징이자 약점을 보완하기 위해서이다.
그렇다면 이 HTTP의 특징은 무엇이고, 그로 인한 약점은 무엇일까?
HTTP 프로토콜
HTTP(Hypertext Transfer Protocol)는 인터넷 상에서 데이터를 주고받기 위해 서버 · 클라이언트 모델을 따르는 통신 규약이다. 이 HTTP 프로토콜의 특징은 비연결성(Connectionless)과 비상태성(Stateless)이다.
- 비연결성(Connectionless) : HTTP는 클라이언트가 서버에 요청을 보내면, 서버는 클라이언트에게 요청에 맞는 응답을 해 준 뒤 접속을 끊는다. 이에 대해서는 논란이 되는 부분이 있으나 여전히 접속을 끊음으로써 연결 비용을 줄이는 것이 HTTP의 장점이기 때문에 비연결성을 가지고 있다고 말한다.
- 비상태성(Stateless) : 상태 정보를 유지하지 않고. 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나게 되며, 상태 정보는 유지하지 않는다.
https://sunrise-new-world.tistory.com/21
1. 쿠키 Cookie
상태가 없는 프로토콜을 위해 상태를 지속시키기 위한방법
웹 브라우저( 클라이언트) 의 정보를 웹 브라우저에 저장하므로,
이후 서버로 전송되는 요청에는 쿠키가 가지고 있는 정보가 같이 포함되서 전송된다.
ex) 자동로그인, 로그인 상태 유지
비번, 아이디 저장 팝업
* 쿠키의 2가지 방식
- 파일 쿠키 : 실제 파일로 남겨서 저장하는 방식
- 웹 쿠키 : 브라우저가 관리
1) 쿠키 동작 방식

2) 쿠키의 구성
* 이름 : 각 쿠키를 구별하는데 사용되는 이름. (알파벳, 숫자 이용)
* 값 : 쿠키의 이름과 같이 저장할 데이터.
* 유효시간 : 쿠키가 유지되는 시간.
* 도메인 : 쿠키를 전송할 도메인.
* 경로 : 쿠키를 전송할 요청 경로.
- 하나의 브라우저는 여러 개의 쿠키를 가질 수 있고 구분할 때, 이름을 사용.
- 각 쿠키는 값을 가지며 서버는 이 값을 사용해 작업 수행.
3) 쿠키 생성
쿠키를 사용하려면 Cookie 클래스를 사용하여 쿠키 객체를 생성해야함
쿠키에는 각 웹 브라우저를 판별할 수 있는 정보 포함되어있음
서버가 응답할때, response 객체에 실려 사용자 브라우저에 저장됨.
정보 전달 방식은 Map(key, value) 형태이다.
[ 쿠키 객체 생성 ]
Cookie cookie = new Cookie(String name, String value);
[ 쿠키 유효기간 설정 ] ([ 도메인, path 도 설정])
cookie.setMaxAge(60);
[ response 객체에 쿠키 추가]
reponse.addCookie(cookie);
name : 쿠키이름
value : 쿠키값
* 쿠키 생성후, 반드시 reponse 객체에 쿠키를 추가해야한다.
* value에 아스키코드가 아닌 값이 들어가야할때는 알맞은 방식으로 인코딩한다.
쿠키 클래스 메서드 | ||
String | getName() | 쿠키 이름 가져오기 |
String | getValue() | 쿠키값 가져오기 |
void | setValue(String value) | 쿠키값 지정 |
void | setDomain(String pattern) | 이 쿠기가 전송될 서버 도메인 지정 |
String | getDomain() | 지정된 도메인 리턴 |
void | setPath(String url) | 이 쿠키를 전송할 경로 지정 |
String | getPath() | 지정된 경로 리턴 |
void | getMaxAge() | 쿠키 유효시간을 초단위로 지정. 음수로 입력할 경우 웹브라우저 닫을때 쿠키가 함께 삭제된다. |
int | getMaxAge() | 쿠키 유효시간을 구함. |
쿠키 읽어오기
#1 쿠키 목록 얻기
존재하는 모든 쿠키 객체를 가져오려면
내장객체 request의 getCookies() 메서드를 사용해야함.
Cookie[] cookies = request.getCookies();
#2. 쿠키 객체 정보 얻기
getName(), getValue() 이용해서 정보얻어야함.
쿠키 삭제
setMaxAge(0)
쿠키는 삭제하는 기능을 별도로 제공하지 않고,
쿠키 유효시간을 만료하면 삭제됨.
즉, setMaxAge(0) 으로 만들어 다시 저장되도록 응답으로 보내기
2. 세션 Session
: 클라이언트와 웹 서버간의 상태를 지속적으로 유지하는 방법
세션 내부 객체 | ||
*Object | getAttribute(String name) | 세션에 저장된 속성명이 name인 값을 Object로 리턴 |
*void | setAttribute(String name, Object value) | 세션에 name 속성명으로 값 저장 (어떤 값이든 저장가능) -> 브라우저가 종료되거나, 삭제할때까지 데이터 유지 |
*void | removeAttribute(String name) | //로그아웃 툴 1 속성명이 name인 속성셋을 삭제 |
*void | invalidate() | //로그아웃툴 2 현재 세션에 저장된 모든 속성 제거 |
java.util.Enumeration | getAttributeNames() | 세션 속성명들을 Enumeration으로 리턴 |
long | getCreationTime() | 세션이 생성된 시간 리턴 |
long | getLastAccessedTime() | 웹 브라우저가 해당 세션에 마지막으로 접근한 시간 리턴 |
int | getMaxInactiveInterval() | 해당 세션을 유지하기 위한 세션 유지시간 리턴. |
void | setMaxInactiveInterval (int interval) | 해당 세션을 유지하기 위한 세션 유지시간 초단위로 설정 default 1800초 (30분) 동안 로그인 유지됨 |
쿠키(Cookie) | 세션(Session) | |
저장 위치 | 방문자(클라이언트) | 서버 |
용량 제한 | 도메인당 20개, 쿠키당 4KB이하 | 용량 제한 없음 |
저장 형식 | text | Object |
만료 시점 | 쿠키 저장 시 설정 가능. 따로 설정하지 않을 경우, 브라우저가 종료될 때 만료 | 정확한 시점을 알 수 없음 |
보안 | 보안 취약 |
보안우수 |