HTTP 특성 먼저 짚고 가기
HTTP는 인터넷 상에서 데이터를 주고 받기 위한 서버-클라이언트 모델을 따르는 프로토콜이다. 클라이언트가 요청을 보내면 서버는 응답을 보냄으로써 데이터를 교환한다.
1. Connectionless Protocol 비연결지향(비연결성)
클라이언트가 서버에 요청했을 때 그 요청에 맞는 응답을 보낸 후 연결을 끊는 처리 방식
2. Stateless Protocol (무상태성, 상태 정보 유지 안함)
클라이언트와 첫 번째 통신에서 데이터를 주고 받았다고 해도 두 번째 통신에서는 이전 데이터를 유지하지 않는다.
HTTP 통신 |
|
장점 | 단점 |
수많은 클라이언트가 서버에 요청을 보내도 비연결성과 무상태성 특성 덕분에 불필요한 자원 낭비를 줄일 수 있다. 즉 최소한으로 접속을 유지하기 때문에 유저가 많아져도 요청을 작은 리소스로 처리할 수 있다. |
서버는 클라이언트를 식별할 수 없게 된다. 즉 요청 간에 의존 관계가 없기 때문에 현재 접속한 유저가 이전에 접속한 유저와 같은지 확인할 방법이 없다. 같은 유저인지 확인하려면 지속적으로 인증을 해줘야 하는 번거로움이 있다. 🔔생각해볼 점 : 자동 로그인 등 모든 요청에 일일이 모든 사용자 정보를 다 넘길 것인가? |
로그인 유지 등 Stateful한 경우를 위해 Cookie와 Session을 이용하여 HTTP 단점을 보완한다.
쿠키(Cookie)🍪
웹 브라우저에 저장되는 작은 데이터 조각이다. 서버는 클라이언트에게 쿠키를 설정할 수 있으며, 이후 클라이언트는 해당 쿠키를 서버로 전송한다. 쿠키는 주로 사용자 식별, 상태 유지, 개인 설정 등에 사용된다.
쿠키 사용 목적 | |
세션 관리 (Session Management) | 서버에 저장해야 할 로그인, 장바구니, 게임 스코어, 접속 시간 등 개인 정보 관리 |
개인화 (Personalization) | 각 사용자에게 적절한 페이지를 보여주기 위함(사용자 선호, 테마 같은 세팅) |
트래킹 (Tracking) | 사용자 행동과 패턴을 분석하고 기록하는 용도 |
쿠키 특징 | 상세설명 |
클라이언트(브라우저)에 저장되기 때문에 보안이 상대적으로 낮다. | 브라우저에서 조작할 수 있어서 중요한 데이터를 담을 수 없다. |
유효 기간을 설정할 수 있다. LifeTime | Session cookie - 현재 세션이 끝날 때(브라우저가 종료될 때) 삭제되는 쿠키 Permanent cookie - 브라우저가 종료되더라도 쿠키가 유지된다. Expires 속성에 명시된 날짜 또는 Max-Age 속성에 명시된 기간 이후에 삭제된다. |
작은 데이터 저장 용량을 가진다. 약 4KB. |
쿠키와 HTTP head
쿠키 요청하기
<%@ 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 | 세션을 유지하기 위한 세션 유지시간을 초 단위로 설정한다. |