프로그래밍/Spring

[Spring] 쿠키(Cookie)와 세션(Session)에 대해 알아보자

byungmin 2022. 1. 4. 12:41

HTTP 프로토콜의 특징

HTTP의 특성을 알아보고 쿠키와 세션이 필요한 이유에 대해 알아보자

 

1. 무상태 프로토콜(Stateless)

통신이 끝나면 상태를 유지하지 않는 특징

 

클라이언트의 요청과 그에 따른 서버의 응답이 끝나면 통신이 끝나며 해당 상태 정보는 유지되지 않는다.

출처 : https://hanamon.kr

 

2. 비 연결성(Connectionless)

클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징

 

비 연결성을 가지는 HTTP에서는 실제로 요청을 주고 받을 때만 연결을 유지하고 응답을 주고나면 TCP/IP 연결을 끊는다.

이를 통해 최소한의 자원으로 서버 유지를 가능하게 한다.

 

쿠키와 세션은 위의 두 가지 특징을 해결하기 위해 사용한다.


쿠키(Cookie)란?

클라이언트를 식별할 때 사용. 클라이언트(브라우저) 로컬에 저장되는 이름과 값의 쌍으로 구성된 작은 정보

 

기본적으로 아스키 문자만 저장 가능하다. (한글은 URL인코딩 필요) 이외에도 도메인 정보, path정보, 유효기간 등을 지정할 수 있다.

 

서버에서 생성 후 응답과 함께 클라이언트에 전송. 브라우저에 저장되며 유효기간 이후에는 자동으로 삭제 된다. 서버에 요청시 도메인, path가 일치하는 경우(하위경로 포함)에만 자동으로 전송한다.

쿠키 작동 과정 출처 : https://interconnection.tistory.com/74

 

  • 클라이언트에 300개까지 쿠키저장 가능, 하나의 도메인당 20개의 값만 가질 수 있음, 하나의 쿠키값은 4KB까지 저장합니다.
  • Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있습니다.

 

쿠키의 동작 방식

  1. 클라이언트가 페이지를 요청
  2. 서버에서 쿠키를 생성
  3. HTTP 헤더에 쿠키를 포함 시켜 응답
  4. 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음
  5. 같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄
  6. 서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답

쿠키의 사용 예

  • 방문 사이트에서 로그인 시, "아이디와 비밀번호를 저장하시겠습니까?"
  • 쇼핑몰의 장바구니 기능
  • 자동로그인, 팝업에서 "오늘 더 이상 이 창을 보지 않음" 체크, 쇼핑몰의 장바구니

코드예제

쿠키의 생성

Cookie cookie = new Cookie("id", "asdf"); // 쿠키 생성
cookie.setMaxAge(60 * 60 * 24); // 유효기간 설정(초), 상대시간
response.addCookie(cookie); // 응답에 쿠키 추가

응답을 보낼 때 응답 메시지에 담겨서 같이 보내진다.

HTTP/1.1 200
Set-Cookie: id=asdf; Max-Age=86400; Expires=Tue, 16-Nov-2021 11:12:34 GMT
Content-Type: text/html;charset=UTF-8
Content-Language: ko-KR
Content-Length: 175
Date: Mon, 15 Nov 2021 11:12:15 GMT

 

쿠키의 삭제와 변경

// 쿠키의 삭제
Cookie cookie = new Cookie("id", ""); // 변경할 쿠키와 같은 이름의 쿠키 생성
cookie.setMaxAge(0); // 유효기간을 0으로 설정(삭제)
response.addcookie(cookie); // 응답에 쿠키 추가

// 쿠키 내용 변경
Cookie cookie = new Cookie("id", ""); // 변경할 쿠키와 같은 이름의 쿠키 생성
cookie.setValue(URLEncoder.encode("moon")); // value값 변경
cookie.setDomain("www.naver.com");	// 도메인 변경
cookie.setPath("/ch2"); // path 경로 변경
cookie.setMaxAge(60*60*24); // 유효기간 변경
response.addCookie(cookie); // 응답에 쿠키 추가

 

서버에서 쿠키 읽어오기

Cookie[] cookies = request.getCookies(); // 쿠키 읽기

for(Cookie cookie : cookies) {
    String name = cookie.getName();
    String value = cookie.getValue();
    
    System.out.println("name = " + name);
    System.out.println("value = " + value);
}

세션(Session)이란?

서로 관련된 요청과 응답을 하나로 묶은 것 - 쿠키를 이용한다.

 

 

브라우저의 요청들은 서로 독립적이다. 서로 관련된 요청들을 하나로 모아서 브라우저마다 개별 저장소(session객체)를 서버에서 제공한다.

 

  • 세션은 쿠키를 기반하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 저장되고 관리한다.
  • 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지한다. 즉, 세션ID를 통해 서로 관련된 요청을 묶어주는 역할을 한다. 같은 세션에 포함되어있는 동안 session 객체를 공유할 수 있다.

세션의 동작 방식

  • 클라이언트가 서버에 첫번째 요청을 보내면 서버에서 세션 객체를 생성한다. 클라이언트에 세션 정보를 쿠키를 통해 전달한다.
  • 클라이언트는 세션 ID에 대한 정보를 쿠키를 사용해서 저장하고 가지고 있음
  • 이후 클라리언트는 서버에 요청할 때, 쿠키의 세션 ID를 같이 서버에 전달해서 요청
  • 서버는 쿠키에 저장된 세션 ID를 전달 받아서 같은 세션ID의 세션객체에 접근하여 클라언트 정보를 사용할 수 있다.
  • 클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답

세션과 관련된 메서드

메서드 설명
String getId() 세션의 ID를 반환
long getLastAccessdTime() 세션 내에서 최근 요청을 받은 시간을 반환
boolean isNew() 새로 생성된 세션인지를 반환. request.getSession()호출 후 사용
void invalidate() 세션 객체를 제거(저장된 객체도 함께)
void setMaxInactiveInterval(int interval) 지정된 시간(초)후에 세션을 종료(예약 종료)
int getMaxInactiveInterval(0 예약된 세션 종료 시간을 반환

 

세션을 종료하는 방법

수동 종료

// 1. 수동 종료
HttpSession session = request.getSession();
session.invalidate();	// 세션을 즉시 종료
session.setMaxInactiveInterval(30*60); // 예약 종료(30분 후)

 

자동 종료 - web.xml

<session-config>
	<session-timeout>30</session-timeout> // 분단위
</session-config>

 

쿠키와 세션의 비교

쿠키(Cookie) 세션(Session)
브라우저에 저장 서버에 저장
서버 부담 X 서버 부담 O
보안에 불리 보안에 유리
서버 다중화에 유리 서버 다중화에 불리

 

세션을 사용하면 좋은데 왜 쿠키를 사용할까?

세션은 서버의 자원을 사용하기 때문에 무분별하게 만들다보면 서버의 메모리가 감당할 수 없어질 수가 있고 속도가 느려질 수 있기 때문에 쿠키가 유리한 경우가 있습니다.