본문으로 바로가기

쿠키, 세션이란?

category 백엔드/Spring 2021. 1. 24. 21:27

네이버 부스트코스 수강하면서 쿠키, 세션에 대해 정리한 글이다.

 

쿠키와 세션을 쓰는 이유?

HTTP프로토콜은 상태 유지가 안되는 프로토콜이다. 이전에 무엇을 했고, 지금 무엇을 했는지에 대한 정보를 갖고 있지 않다.

요청과 응답의 상태 유지를 위해 쿠키와 세션이 등장했다.

 

 

쿠키(Cookie)와 세션(Session)

- 쿠키

-> 사용자 컴퓨터에 저장

-> 저장된 정보를 다른 사람 또는 시스템이 볼 수 있는 단점

-> 유효시간이 지나면 사라짐

 

- 세션

-> 서버에 저장

-> 서버가 종료되거나 유효시간이 지나면 사라진다.

 

 

그림으로 보는 쿠키 동작 이해

 

쿠키 동작 이해 1/2
쿠키 동작 이해 2/2

 

 

 

그림으로 보는 세션 동작 이해

 

세션 동작 이해 1/2

 

세션 동작 이해 2/2

 

 

쿠키

 

<정의>

 

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

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

 

 

<이용 방법>

 

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

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

 

 

<주요 메소드>

 

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

- 서버에서 쿠키 생성 후 클라이언트로 전송.

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

 

Cookie[] cookies = request.getCookies();

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

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

- 이 형태로는 반복문을 통해 원하는 쿠키 정보를 가져올 수 있다.

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

형태로 사용하면 원하는 쿠키 정보를 파라미터 변수에 담아 사용할 수 있다.

 

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

- 쿠키를 삭제하는 명령은 따로 존재하지 않는다.

- maxAge가 0으로 set 하면 유효기간을 0으로 지정되면서 쿠키를 삭제시킬 수 있다.

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

 

 

세션

 

<내부 프로세스>

 

-> 클라이언트가 서버에 요청을 보내면

-> 서버는 요청한 클라이언트가 가질 수 있는 session id를 발급한다.

-> 서버는 이 session id를 이용해 Key, Value를 저장할 수 있는 HttpSession을 생성한다.

-> 서버는 session id를 저장하고 있는 쿠키를 생성하여 요청한 클라이언트에 전송한다.

-> 클라이언트는 서버측에 요청을 보낼 때 session id를 가지고 있는 쿠키를 전송한다.

-> 서버는 쿠키에 있는 session id를 이용해서 그 전 요청에서 생성한 HttpSession을 찾고 사용한다.

이 프로세스는 요청한 클라이언트마다 독립적으로 실행된다.

 

 

<주요 메소드>

request.getSession();
request.getSession(true);

서버에 생성된 세션이 있다면 세션을 반환하고 없다면 새롭게 세션을 생성하여 반환한다.

내부적인 동작은, 클라이언트로 부터 session id로 되어있는 쿠키가 있는지 없는지 확인하는 작업을 수행한다.

 

 

request.getSession(false);

파라미터로 false를 전달하면, 이미 생성된 세션이 있다면 반환하고 없으면 null을 반환한다.

 

 

request.isNew();

세션이 새로 만들어졌으면 true, 이미 만들어진 세션이면 false를 반환

 

 

 

<쿠키는 이름과 값이 모두 문자열이지만, 세션의 키값은 문자열이고 값은 객체를 저장할 수 있다. 왜 이런 차이가 있을까??>

 

cookie는 클라이언트에서 데이터를 저장하기 위한 자료구조이고, session은 서버에서 데이터를 저장하기 위한 구조이다.

cookie는 클라이언트에서 file에 저장하기 때문에 key=value 형태의 문자열로 저장을 하고, session은 서버의 memory에 데이터를 저장한다. 이때 map(key=value) 형태의 자료구조를 사용하는데, key는 cookie에 저장된 session id값이 저장되고, value에는 Java Object를 상속받은 모든 객체를 저장할 수 있다. session 정보는 서버의 메모리에 저장되기 때문에 서버(was)가 shutdown 되면 모두 사라진다. 따라서 세션 정보가 영속성(persistance)을 가지려면 별도의 저장소(DB, File 등)에 세션 정보를 보관해야 한다.

 

 

출처 : https://www.boostcourse.org/