
1. Cookie란?
- 클라이언트(브라우저)에 저장되는 키와 값이 들어있는 작은 데이터파일!
- 중복되지 않는 name과 value 한 쌍으로 이루어짐
- 순서가 없다
- 만료 기한(나이)를 지정해 줄 수 있다, 단 지정해 주지 않으면 Session 값으로 저장된다.
- 웹 브라우저가 보관하고 있는 데이터로, 웹 서버에 요청을 보낼 때 쿠키를 헤더에 담아 전송한다.
2. Session이란?
- Session은 클라이언트와 서버 간 연결된 상태를 유지하기 위해 서버에 저장되는 데이터이다.
- 클라이언트가 서버에 접속하면, 서버는 고유한 Session ID를 생성해 클라이언트에게 전달한다.
- 클라이언트는 Session ID를 쿠키에 저장하거나 URL에 포함해 서버와 통신하며, 서버는 이 ID로 클라이언트를 식별한다.
- 세션 데이터는 서버의 메모리 또는 데이터베이스에 저장되며, 클라이언트가 브라우저를 닫거나 세션 만료 시간이 지나면 삭제된다.
- 쿠키는 클라이언트에 저장되어 데이터를 로컬에서 유지한다.
- 세션은 서버에서 데이터를 관리하여 보안과 사용자 상태를 유지하는 데 적합하다.
3. 비교
| 항목 | Cookie(쿠키) | Session(세션) |
| 저장위치 | 클라이언트(브라우저) | 서버 |
| 데이터 크기 제한 | 최대 4KB | 서버 메모리/DB 용량에 따라 다름 |
| 보안 | 클라이언트에 저장되므로 상대적으로 취약 | 서버에 저장되므로 비교적 안전 |
| 수명 | 만료 기한 설정 가능 (기한 설정 없으면 브라우저 종료 시 삭제) |
브라우저 종료 또는 세션 만료 시 삭제 |
| 속도 | 클라이언트에 저장되므로 서버 부하가 적음 | 서버에서 관리하므로 부하 발생 가능 |
| 사용 목적 | 사용자 식별정보 저장 (자동로그인, 설정 유지 등) | 사용자 상태 관리 (로그인 상태 유지, 장바구니 등) |
| 전송 방식 | HTTP 요청 시 헤더에 포함해 자동으로 전송 | 클라이언트에서 Session ID 를 통해 서버와 통신 |
| 유지 방식 | 클라이언트에서 직접 쿠키 값을 수정/삭제 가능 | 서버에서만 관리 가능, 클라이언트는 Session ID만 소유 |
4. 쿠키 실습
LoginServlet.java 서블릿
4-1. 쿠키 생성 & 설정
// 쿠키 생성
Cookie cookie = new Cookie("userName", "다인");
// 만료 기한 설정 (1일 = 24시간 * 60분 * 60초)
cookie.setMaxAge(24 * 60 * 60); // 86400초, 즉 1일 동안 유효
// 응답에 쿠키 추가
response.addCookie(cookie);
4-2. 쿠키를 브라우저에 전송하기
// 쿠키를 생성한 뒤, response 객체에 추가하면 브라우저에 쿠키가 전송되어 저장됩니다.
response.addCookie(cookie);
response.sendRedirect("Ex01GetCookie.jsp"); // 페이지 이동
4-3. Cookie 꺼내오기
// 쿠키 가져오기
Cookie[] cookies = request.getCookies();
// 쿠키 배열에서 "season" 이름의 쿠키를 찾고 값 출력
if (cookies != null) {
for (Cookie c : cookies) {
if ("season".equals(c.getName())) { // "season" 이름의 쿠키인지 확인
String value = c.getValue(); // 쿠키 값 가져오기
out.println("<h1>쿠키 값: " + value + "</h1>"); // 쿠키 값 출력
}
}
}
4-4. 확인 방법
브라우저에서 F12(개발자 도구) > [Application] > 좌측 메뉴에서 [Cookies] 클릭 > 해당 웹사이트 URL 선택
설정된 쿠키 목록에서 이름과 값 확인 가능

(저는 현재 열어 놓은 창이 많아서 이렇게 나오니 양해 부탁드립니다.)

4-5. 쿠키는 언제 사용돼?
⚡ 자동 로그인
사용자가 로그인 시 "아이디 저장" 또는 "로그인 상태 유지" 옵션을 선택하면, 해당 정보를 쿠키에 저장하여 이후 방문 시 자동으로 로그인할 수 있다.
⚡ 팝업 다시 보지 않기
"일주일간 이 창을 다시 보지 않기"와 같은 설정을 쿠키에 저장하여, 사용자가 설정한 기간 동안 동일한 팝업이 나타나지 않도록 합니다.
⚡쇼핑몰 장바구니
로그인하지 않은 사용자가 선택한 상품들을 쿠키에 임시 저장하여, 페이지를 이동하거나 브라우저를 닫았다가 다시 열어도 장바구니 정보가 유지되도록 한다.
⚡ 최근 본 상품 표시
사용자가 조회한 상품 정보를 쿠키에 저장하여, 메인 페이지나 추천 섹션에 최근 본 상품들을 표시한다.
5. 세션 실습
세션 기본 메서드
setAttribute(String name, Object value)
세션에 데이터를 저장하는 메서드 (name은 키, value는 값)
getAttribute(String name)
세션에서 데이터를 가져오는 메서드, 해당 키가 없으면 null을 반환
removeAttribute(String name)
세션에서 특정 데이터를 제거하는 메서드
invalidate()
세션을 완전히 무효화하는 메서드 (로그아웃)

위와 같은 웹 사이트에서
- 로그인 하지 않은 경우에는 guest 님 환영합니다
- 로그인 한 경우 'guest' 자리에 'ㅇㅇ(유저아이디)'님 환영합니다.
라는 문구를 띄우고 싶을 때 세션을 활용한다.
먼저 home.jsp를 만들고 페이지 배너의 헤더 부분에 있는 <h1> 태그에 스크립트릿<%%> 을 열어
<header class="major">
<h1>Hi, guest님 환영합니다 👋</h1>
</header>
자바 코드를 삽입 해 준다.
<header class="major">
<!-- session에서 사용자 이름 가져오기 -->
<h1>Hi, <%= session.getAttribute("userName") != null ?
session.getAttribute("userName") : "guest" %>님 환영합니다 👋</h1>
</header>
로그아웃도 세션을 통해서 이루어지기 때문에 로그아웃 버튼도 만들어 준다.
home.jsp
<!-- Banner -->
<section id="banner" class="major">
<div class="inner">
<header class="major">
<!-- session에서 사용자 이름 가져오기 -->
<h1>Hi, <%= session.getAttribute("userName") != null ? session.getAttribute("userName") : "guest" %>님 환영합니다 👋</h1>
</header>
<div class="content">
<p>This page is for the QueryString<br />
Example</p>
<ul class="actions">
<li><a href="#one" class="button next scrolly">Get Started</a></li>
</ul>
</div>
</div>
</section>
<!-- 로그아웃 버튼 -->
<form action="logout" method="post">
<button type="submit">로그아웃</button>
</form>
이제 사용자의 아이디와 비밀번호를 받는 login.jsp 페이지를 만들어 준다.
login.jsp
<%@ page session="true" %>
<!DOCTYPE html>
<html>
<head>
<title>로그인</title>
</head>
<body>
<h1>로그인 페이지</h1>
<!-- 로그인 실패 메시지 출력 -->
<%
String error = request.getParameter("error");
if ("invalid".equals(error)) {
%>
<p style="color: red;">아이디 또는 비밀번호가 잘못되었습니다.</p>
<%
}
%>
<!-- 로그인 폼 -->
<form action="login" method="post">
<label for="username">아이디:</label>
<input type="text" id="username" name="username" required><br>
<label for="password">비밀번호:</label>
<input type="password" id="password" name="password" required><br>
<button type="submit">로그인</button>
</form>
</body>
</html>
5-1. 세션 생성 & 데이터 저장 (로그인)
아래는 사용자가 입력한 아이디와 비밀번호를 처리하는 서블릿 클래스
이 코드는 로그인 요청을 처리하고, 성공 시 세션에 사용자 이름을 저장하는 로직
LoginServlet.java
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/login") // URL 패턴: /login
public class LoginServlet extends HttpServlet {
// POST 요청 처리
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 클라이언트에서 전송된 파라미터(아이디와 비밀번호) 받기
String username = request.getParameter("username"); // 아이디
String password = request.getParameter("password"); // 비밀번호
// 예제: 간단한 로그인 검증 (하드코딩된 계정 정보 사용)
// 실제 환경에서는 DB를 활용한 인증 구현 필요
if ("admin".equals(username) && "1234".equals(password)) {
// 로그인 성공
// 세션 생성 또는 기존 세션 가져오기
// 세션에 사용자 정보 저장
HttpSession session = request.getSession();
session.setAttribute("userName", username);
// 홈 페이지로 리다이렉트
response.sendRedirect("home.jsp");
} else {
// 로그인 실패
// 로그인 페이지로 리다이렉트 (에러 메시지 추가)
response.sendRedirect("login.jsp?error=invalid");
}
}
}
이렇게 하면 home 화면에서 session.getAttiribute("userName")를 통해 서블릿에서 세션에 저장된 username 이 화면에 띄워진다.

만약에 세션이 비어있는 경우, guest님 환영합니다 라는 문구를 보여주는 대신, 사용자를 로그인 페이지로 리디렉션 시키고 싶다면 body 태그 아래쪽에 스크립트릿 <% %> 을 열어서 java 코드를 쓰고, 로그인 한 사용자에게만 보여줄 환영 문구에는 표현식 <%= userName %>을 사용하면 된다.
<%@ page session="true" %>
<!DOCTYPE html>
<html>
<head>
<title>홈 페이지</title>
</head>
<body>
<%
// 세션에서 사용자 이름 가져오기
String userName = (String) session.getAttribute("userName");
if (userName == null) {
// 세션에 데이터가 없을 경우 로그인 페이지로 이동
response.sendRedirect("login.jsp");
}
%>
<h1>안녕하세요, <%= userName %>님!</h1>
<p>홈 페이지에 오신 것을 환영합니다.</p>
<!-- 로그아웃 버튼 -->
<form action="logout" method="get">
<button type="submit">로그아웃</button>
</form>
</body>
</html>
🔥 주의할 점
표현식(Expression Tag) 내부에는 반드시 값(표현식)만 있어야 하며, 세미콜론(;)을 사용하지 않아야 한다.
올바른 예:
<%= userName %>
잘못된 예:
<%= userName; %> <!-- 에러 발생 -->
5-2. 로그아웃 처리
session.invalidate()로 가능
LogoutServlet.java
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/logout") // URL 패턴: /logout
public class LogoutServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 세션 무효화
HttpSession session = request.getSession(false); // 기존 세션 가져오기
if (session != null) {
session.invalidate(); // 세션 종료
}
// 로그인 페이지로 리다이렉트
response.sendRedirect("login.jsp");
}
}
6. 쿼리스트링


추가적으로 로그인된 사용자 이름을 화면에 띄우는 다른 방식으로 쿼리스트링이 있다.
쿼리스트링은 사용자가 입력 데이터를 전달하는 방법 중 하나로, url 주소에 미리 협의된 데이터를 파라미터를 통해 넘기는 것을 말한다.
예를 들어, URL이
http://example.com/home.jsp?name=Dain
이라면, name이라는 파라미터를 받아와서 JSP에서 사용할 수 있다.
다시 home.jsp 페이지에에 가면 쿼리 스트링으로 받은 이름을 출력할 수 있다.
<%@ page session="true" %>
<!DOCTYPE html>
<html>
<head>
<title>홈 페이지</title>
</head>
<body>
<%
// 쿼리 스트링에서 "name" 파라미터를 가져옴
String userName = request.getParameter("name");
if (userName == null) {
userName = "guest"; // 쿼리 스트링에 이름이 없으면 guest로 설정
}
%>
<h1>안녕하세요, <%= userName %>님!</h1>
<p>홈 페이지에 오신 것을 환영합니다.</p>
</body>
</html>
7. 쿼리스트링과 세션
7-1. 쿼리스트링의 유효범위
한 마디로 쿼리스트링과 세션의 차이를 이해하는 데 있어 중요한 점은 둘의 유효 범위이다.
쿼리스트링 (Query String)URL의 일부로, 주로 페이지 간 데이터를 전달하는 데 사용된다. URL에 값을 포함시켜 전달하고, 그 값을 request.getParameter("userName") 등을 통해 해당 페이지에서 사용할 수 있다.
예를 들어서 아래와 같은 URL 이 있다고 가정하자.
https://example.com/home.jsp?userName=Dain
이 때 유효 범위는? 쿼리스트링에서 전달된 데이터는 현재 페이지에만 유효하다.
URL을 통해 다른 페이지로 이동하면 쿼리스트링의 값은 사라진다.
<!-- home.jsp에서 -->
<h1>안녕하세요, <%= request.getParameter("userName") %>님!</h1>
쿼리스트링 방식은 home.jsp 페이지에서만 userName 값을 사용하고, 다른 페이지로 이동하면 값이 사라지게 된다는 특징이 있다.
7-2. 세션의 유효범위
위에서 살펴 봤듯이 세션은 서버 측에서 관리되는 데이터로, 사용자가 웹 애플리케이션을 사용하는 동안 세션이 유효한 모든 페이지에서 접근할 수 있다.
즉, 세션에 저장된 값은 브라우저가 닫히기 전까지, 혹은 세션이 만료될 때까지 유효하다. 따라서 사용자가 여러 페이지를 이동하는 동안에도 세션에 저장된 데이터를 계속 사용할 수 있다.
쿼리스트링과 달리 세션을 사용하면 한 번의 로그인으로 웹사이트 내의 여러 페이지에서 사용자 정보를 불러 올 수 있다.
예를 들어 사용자가 네이버에서 한 번의 로그인을 하면, userName이 세션에 저장되므로 여러 페이지에서 동일한 사용자 이름을 화면에 띄울 수 있다는 것이다. 뉴스, 블로그, 메일,스포츠, 노트 등 다른 페이지를 옮겨 다닐 때도 네이버는 해당 사용자의 이름 정보를 계속 사용 할 수 있기 때문에 나의 로그인 정보가 유지된다.
각 페이지에서 Session.getAttribute() 를 쓰면 되기 때문이다.
쿼리스트링: 페이지를 이동하면 값이 사라짐. 해당 페이지에서만 유효.
세션: 사용자가 웹 애플리케이션을 사용하는 동안 계속 유효. 다른 페이지에서도 계속 사용 가능
7-3. 세션 타임아웃
하지만 세션에 시간 제한이 없다면 브라우저는 계속 로그인이 유지되는 동안 사용자의 정보를 제공하게 된다.
세션 타임아웃을 설정하면 일정 시간이 지나면 자동으로 세션이 종료되어 보안을 강화할 수 있다.
세션 타임아웃은 사용자가 웹 애플리케이션을 일정 시간 동안 활동하지 않으면 자동으로 로그아웃되도록 설정하는 기능이다.사용자가 로그인한 상태로 웹 페이지를 떠나거나 일정 시간 동안 아무런 활동을 하지 않으면, 서버는 세션을 자동으로 종료하고 해당 사용자의 정보를 더 이상 유지하지 않게 된다.
세션 타임아웃 설정하는 법은 web.xml에서 가능 하다.
<session-config>
<session-timeout>30</session-timeout> <!-- 30분 -->
</session-config>
8. 형변환(Casting)
코드를 정리하다가 추가로 다루고 싶은 내용
🔥 왜 String으로 형변환을 해?
HttpSession 객체의 getAttribute() 메서드는 모든 객체를 Object 타입으로 반환하기 때문이다.
String userName = (String) session.getAttribute("userName");
Object 타입은 모든 클래스의 부모이기 때문에, 해당 객체가 실제로 String이 아닌 다른 타입일 수 있다.
하지만 세션에 저장할 때 String 객체로 저장했다면 정확하게 String 타입으로 형변환하여 사용해야 한다.
Object obj = session.getAttribute("userName");
if (obj != null) {
String userName = (String) obj; // 형변환 후 사용
// 이제 userName을 문자열로 사용할 수 있음
}
🔥 형변환이 실패하면?
형변환을 잘못하면 ClassCastException 예외가 발생할 수 있다.
예를 들어, 세션에 저장된 값이 String이 아닌 다른 타입이라면, 해당 값을 String으로 형변환하려 할 때 오류가 발생한다. 이를 방지하려면 세션에 저장할 때 타입을 명확히 확인하고, 필요하다면 형변환을 안전하게 처리해야 한다.
참고 자료
1. 내 머릿속
2. 스인재 채수민쌤 JSP 수업 실습내용
3. htmlup5 (https://html5up.net/)
4. session Time out 부분은 궁금한 것을 chatGPT 에 물어봄
5. 포스팅 작성에 도움을 주신 블로그 (꾸벅)
Query String 쿼리스트링이란 ?
사용자가 입력 데이터를 전달하는 방법 중 하나로, url 주소에 미리 협의된 데이터를 파라미터를 통해 넘기는 것을 말한다.https://www.google.com/search?q=밥 물음표 뒤에 =로 연결된 key value pair 부분을 u
velog.io
각 주제에 대한 공식 문서 링크
1. 세션 및 쿠키
- Mozilla HTTP 쿠키 https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies
- Java EE 7 Specifications - Session Management https://docs.oracle.com/javaee/7/api/javax/jms/Session.html
- Oracle - Configuring Session Timeout https://docs.oracle.com/en/database/oracle/application-express/21.1/aeadm/configuiring-session-timeout.html

'Java' 카테고리의 다른 글
| [JSP & Servlet] URL 매핑 (9) | 2025.01.28 |
|---|---|
| [Java] 쿼리스트링 으로 값 넘겨서 화면에 출력하기 (15) | 2025.01.26 |
| [Java] WebContent 와 /src/main/webapp의 차이점 (17) | 2025.01.26 |
| [이클립스] web.xml & Maven pom.xml 파일이 텍스트 에디터 형식으로 안 열릴 때 해결법 (8) | 2025.01.26 |
| [Java] 자바로 SOAP 요청/응답 (SOAP Request/Response), WSDL, UDDI, XML (11) | 2025.01.25 |