본문 바로가기
카테고리 없음

쿠키🍪와 세션📅

by 개발자공부 2024. 7. 5.

 

 

HTTP 특성 먼저 짚고 가기

HTTP는 인터넷 상에서 데이터를 주고 받기 위한 서버-클라이언트 모델을 따르는 프로토콜이다. 클라이언트가 요청을 보내면 서버는 응답을 보냄으로써 데이터를 교환한다. 

1. Connectionless Protocol 비연결지향(비연결성)
클라이언트가 서버에 요청했을 때 그 요청에 맞는 응답을 보낸 후 연결을 끊는 처리 방식

2. Stateless Protocol (무상태성, 상태 정보 유지 안함)
클라이언트와 첫 번째 통신에서 데이터를 주고 받았다고 해도 두 번째 통신에서는 이전 데이터를 유지하지 않는다.
HTTP 통신
장점 단점
수많은 클라이언트가 서버에 요청을 보내도 비연결성과 무상태성 특성 덕분에 불필요한 자원 낭비를 줄일 수 있다.
즉 최소한으로 접속을 유지하기 때문에 유저가 많아져도 요청을 작은 리소스로 처리할 수 있다.
서버는 클라이언트를 식별할 수 없게 된다.
즉 요청 간에 의존 관계가 없기 때문에 현재 접속한 유저가 이전에 접속한 유저와 같은지 확인할 방법이 없다. 같은 유저인지 확인하려면 지속적으로 인증을 해줘야 하는 번거로움이 있다.

🔔생각해볼 점 : 자동 로그인 등 모든 요청에 일일이 모든 사용자 정보를 다 넘길 것인가?

 

로그인 유지 등 Stateful한 경우를 위해 CookieSession을 이용하여 HTTP 단점을 보완한다.


 

쿠키(Cookie)🍪

웹 브라우저에 저장되는 작은 데이터 조각이다. 서버는 클라이언트에게 쿠키를 설정할 수 있으며, 이후 클라이언트는 해당 쿠키를 서버로 전송한다. 쿠키는 주로 사용자 식별, 상태 유지, 개인 설정 등에 사용된다.

쿠키 사용 목적
세션 관리 (Session Management) 서버에 저장해야 할 로그인, 장바구니, 게임 스코어, 접속 시간 등 개인 정보 관리
개인화 (Personalization) 각 사용자에게 적절한 페이지를 보여주기 위함(사용자 선호, 테마 같은 세팅)
트래킹 (Tracking) 사용자 행동과 패턴을 분석하고 기록하는 용도
쿠키 특징 상세설명
클라이언트(브라우저)에 저장되기 때문에 보안이 상대적으로 낮다. 브라우저에서 조작할 수 있어서 중요한 데이터를 담을 수 없다.
유효 기간을 설정할 수 있다. LifeTime Session cookie - 현재 세션이 끝날 때(브라우저가 종료될 때) 삭제되는 쿠키
Permanent cookie - 브라우저가 종료되더라도 쿠키가 유지된다. Expires 속성에 명시된 날짜 또는 Max-Age 속성에 명시된 기간 이후에 삭제된다.
작은 데이터 저장 용량을 가진다. 약 4KB.  

 

쿠키와 HTTP head

쿠키 요청하기

jakarta.servlet.http 패키지를 이용한다. servlet은 http를 상속받는다. jsp는 결국 servlet이 실행된다.

더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%
Cookie[] cookies = request.getCookies();
String cUsername = null;
// 쿠키는 여러 개 존재 가능하다. 
// 여기 페이지에서 필요한 쿠키는 우리가 정의한
// username이라는 이름을 가진 녀석이다.
if (cookies != null) {
	for (Cookie c : cookies) {
		if (c.getName().equals("username")) {
	cUsername = c.getValue();
	break;
		}
	}
}
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>get Cookie</title>
</head>
<body>
	<h2>쿠키 읽기</h2>
	<%
	if (cUsername != null) {
		out.println("<p>안녕하세요! " + cUsername + "님</p>");
	} else {
		out.println("<p>쿠키가 설정되지 않았습니다.</p>");
	}
	%>

	<a href="setCookie.jsp">쿠키 설정하러 가기</a>
</body>
</html>
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%
String username = "초코쿠키";
Cookie userCookie = new Cookie("username", username);
/* 쿠키는 요청한 사용자 브라우저에 저장된다.
	즉, setCookie.jsp를 요청한 사용자에 
	response 객체로 데이터 조각을 담아서 보내주어야 한다.
*/
userCookie.setMaxAge(60 * 60 * 24); // LifeTime

response.addCookie(userCookie);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>set Cookie</title>
</head>
<body>

	<h1>사용자가 이 페이지 요청시에 서버측에서 쿠키를 생성해서 응답합니다.</h1>
	<a href="getCookie.jsp">쿠키 값 읽어보는 페이지</a>

</body>
</html>
더보기
개발자 도구에서 쿠키 값 확인하기. 임의로 추가, 변경, 제거도 가능하다.

 

할당된 쿠키 삭제하고 새로고침 해보기
쿠키 삭제한 후 새로고침 결과

세션(Session)📅

서버에 저장되는 사용자별 데이터이다. 각 사용자는 고유한 세션 ID를 가지며 이를 이용해 서버는 사용자를 식별할 수 있다. 세션은 주로 로그인 정보, 사용자 설정, 애플리케이션 상태 등을 저장하는데 사용된다.

 

동작순서

클라이언트 요청 -> Request-Header 필드의 Cookie에서 세션ID를 보냈는지 확인 
-> 세션ID가 없을 경우 서버에서 생성하여 클라이언트에게 전송 -> 쿠키를 사용해 세션ID를 서버에 저장
-> 클라이언트 재접속 시 쿠키를 이용하여 세션ID값을 서버에 전달

 

 

특징

서버에 저장
클라이언트와 서버 간의 상태를 유지한다.
비교적 큰 데이터 저장 용량을 가진다.
보안이 상대적으로 높다.

 

세션ID : 서버는 클라이언트와의 상호작용을 추적하기 위해 세션ID를 사용한다. 클라이언트는 서버로부터 세션 ID를 쿠키로 전달받으며, 이후 모든 요청에 이 세션 ID를 포함하여 서버에 전송한다. 서버는 이 세션ID를 통해 클라이언트의 상태를 유지한다. 

 

추상적인 개념 : 클라이언트와 서버 간의 상태 유지는 물리적인 연결을 의미하는 것이 아니라 클라이언트의 상태 정보를 세션 ID를 통해 추적하고 관리하는 추상적인 개념이다. 

 

메소드

메소드 이름 리턴 타입 설명
getId() java.lang.String 세션에 할당된 고유 식별자를 String 타입으로 리턴한다.
getCreationTime() long 1970년 1월 1일 0시 0초를 기준으로 하여 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000초 값으로 리턴한다.
getLasAccessedTime() long 웹 브라우저가 가장 마지막에 세션에 접근한 시간을 구한다. 시간은 1970년 1월 1일 이후 흘러간 시간을 의미하며, 단위는 1/1000초이다.
getAttribute(String name) java.lang.Object 세션 속성명이 name인 속성의 값을 Object 타입으로 리턴한다. 해당 되는 속성명이 없을 경우에는 null 값을 리턴한다.
getAttributeNames() java.util.Enumeration 세션 속성의 이름들을 Enumeration 객체 타입으로 리턴한다.
getMaxInactiveInterval() int 현재 생성된 세션을 유지하기 위해 설정된 세션 유지시간을 int형으로 리턴한다.
invalidate() void 현재 생성된 세션을 무효화 시킨다.
removeAttribute(String.name) void 세션 속성명이 name인 속성을 제거한다.
setAttribute(String name, Object value) void 세션 속성명이 name인 속성에 속성값으로 value를 할당한다.
setMaxInactiveInterval(int interval) void 세션을 유지하기 위한 세션 유지시간을 초 단위로 설정한다.