
무 연결(Connectionless)
요청 순간만 연결·응답 직후 바로 끊김
무 상태(Stateless)
이전 요청 상태를 기억하지 않음
모든 요청은 독립적
이 문제를 해결하는 대표 기술이 Cookie(클라이언트 저장), Session(서버 저장).
Cookie cookie = new Cookie("firstName", "file01");
cookie.setMaxAge(60 * 60); // 1시간 유지
cookie.setPath("/");
response.addCookie(cookie);
response.sendRedirect("/cookie-redirect");
Cookie[] cookies = request.getCookies();
String firstName = null;
String lastName = null;
if (cookies != null) {
for (Cookie c : cookies) {
if ("firstName".equals(c.getName())) firstName = c.getValue();
if ("lastName".equals(c.getName())) lastName = c.getValue();
}
}
PrintWriter out = response.getWriter();
out.println("Your first name is " + firstName + ", last name is " + lastName);
@WebServlet("/cookie-handler")
public class CookieHandler extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String firstName = request.getParameter("firstName");
String lastName = request.getParameter("lastName");
Cookie first = new Cookie("firstName", firstName);
Cookie last = new Cookie("lastName", lastName);
first.setMaxAge(60 * 5); // 5분
last.setMaxAge(60 * 5);
response.addCookie(first);
response.addCookie(last);
response.sendRedirect("/cookie-redirect");
}
}
@WebServlet("/cookie-redirect")
public class CookieRedirect extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String firstName = null;
String lastName = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("firstName".equals(cookie.getName())) firstName = cookie.getValue();
if ("lastName".equals(cookie.getName())) lastName = cookie.getValue();
}
}
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("Your first name is " + firstName + ", last name is " + lastName);
out.close();
}
}
HttpSession session = request.getSession(); // 없으면 자동 생성
HttpSession session = request.getSession(true); // 없으면 생성
HttpSession session = request.getSession(false); // 없으면 null
session.setAttribute("firstName", "name01");
session.setMaxInactiveInterval(600); // 10분 유지
String name = (String) session.getAttribute("firstName");
Enumeration<String> names = session.getAttributeNames();
while (names.hasMoreElements()) {
String key = names.nextElement();
System.out.println(key + " : " + session.getAttribute(key));
}
session.removeAttribute("firstName");
session.invalidate();
invalidate 이후에는 반드시 새로운 세션을 받아야 함.
@WebServlet("/session-handler")
public class SessionHandler extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
HttpSession session = request.getSession();
String firstName = request.getParameter("firstName");
String lastName = request.getParameter("lastName");
session.setAttribute("firstName", firstName);
session.setAttribute("lastName", lastName);
response.sendRedirect("/session-redirect");
}
}
@WebServlet("/session-redirect")
public class SessionRedirect extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
HttpSession session = request.getSession();
String firstName = (String) session.getAttribute("firstName");
String lastName = (String) session.getAttribute("lastName");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("Session data: " + firstName + " " + lastName);
out.close();
}
}
@WebServlet("/session-delete")
public class DeleteSessionData extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
response.sendRedirect("/session-redirect");
}
}
| 구분 | Cookie | Session |
|---|---|---|
| 저장 위치 | 클라이언트 | 서버 |
| 보안 | 낮음 | 높음 |
| 용량 | 제한 있음 | 서버 메모리 사용 |
| 유지 기간 | 직접 설정 | 기본은 브라우저 종료 시까지 |
| 대표 용도 | 팝업 유지, 자동로그인, 간단 데이터 | 로그인, 장바구니, 인증정보 |
| 식별 방식 | name=value | JSESSIONID로 식별 |