Don't Panic
in JSP·Servlet ☕ 3분 읽기

[JSP·Servlet] 세션(Session)과 쿠키(Cookie) — 상태 유지의 두 가지 방법

목차

로그인 인증과 객체 바인딩

객체 바인딩을 하는 이유는, 회원 가입에 성공하면 다른 객체들도 그 사실을 알아야 하기 때문이다.

MemberDAO dao = new MemberDAO();
String user_name = dao.memberLogin(vo); // 로그인 처리 구현

// user_name에 값이 있으면 인증 성공, 없으면 인증 실패
if (user_name != null && !"".equals(user_name)) {
    // 인증 성공 → 세션에 사용자 정보 저장
    HttpSession session = request.getSession();
    session.setAttribute("userId", user_id);
    session.setAttribute("userName", user_name);
} else {
    // 인증 실패 → 세션 초기화 후 오류 메시지 설정
    request.getSession().setAttribute("userId", "");
    request.getSession().setAttribute("userName", "");
    request.getSession().setAttribute("msg", "사용자 정보가 올바르지 않습니다.");
}
return "redirect:" + ctx + "/memberList.do";

HttpSessionrequest.getSession()으로 얻는다. 로그인에 성공하면 userId·userName이 세션에 setAttribute되어 객체 바인딩된다.

회원 인증을 확인하려면 세션 객체를 가져와 userId의 값을 꺼내면 된다.

하나의 PC에서 브라우저 두 개를 띄우면, 서버 입장에서는 두 명이 접속한 것으로 처리된다.

20210618_120003

로그인에 성공하면 세션 기록을 읽어 서비스하고, 실패하면 다시 로그인 페이지로 리다이렉트한다.


세션(Session)이란?

Request(요청)Response(응답) 가 생성될 때마다 새로운 객체가 만들어진다. 다른 페이지로 포워딩(forwarding)할 때 request.setAttribute로 바인딩한 데이터를 넘길 수 있지만, 이는 포워딩 범위 내에서만 유효하다. 리다이렉트처럼 새 요청이 발생하면 기존 request 객체는 소멸된다.

20210618_145444

JSP는 세션에서 꺼낼 수 있다. A 페이지에서 인증하고 성공하면 서비스하고, 아니면 리턴(로그인 페이지로 돌아감)한다.


쿠키(Cookie)란?

쿠키 = 흔적 (과자를 먹으면 흔적이 남는다)

클라이언트가 서버에 요청하면, 서버는 클라이언트를 식별하기 위해 수강권(쿠키) 을 만들어 클라이언트에게 내려보낸다.

20210618_150519

구성 요소설명
클라이언트 측 쿠키서버가 발급한 세션 식별자(수강 번호) 보관
서버 측 캐비넷(세션 저장소)수강 번호에 해당하는 데이터 보관

캐비넷은 수강 번호(세션 ID)가 있어야만 사용 가능하다. 클라이언트와 서버가 이렇게 연결되어 있는 것이 바로 세션이다.

  • 첫 방문: 수강 번호가 없으므로 서버가 새로 발급해 쿠키로 내려보낸다.
  • 재방문: 브라우저가 쿠키(수강 번호)를 request 객체에 담아 서버로 전달한다.

20210618_150737

번호만 같으면 자신의 캐비넷을 마음대로 사용할 수 있다. 이 메모리 공간에 setAttribute해두면 어디서든 꺼내 쓸 수 있다.

20210618_153947


getSession()의 동작 원리

클라이언트가 처음 방문했는지 여부를 서버가 판단해야 할 필요가 있다.

20210618_162154

20210618_162204

  • 세션이 있는 경우: 기존 세션 메모리에서 값을 꺼내 사용한다.
  • 세션이 없는 경우: 새 세션을 생성하고 쿠키로 클라이언트에 내려보낸다.

로그인 성공 시 세션을 생성하기 전에, 이미 세션이 존재하는지 먼저 확인해야 한다.

request.getSession()을 호출하면:

  1. 이미 세션이 있으면 → 기존 세션 객체를 반환한다.
  2. 없으면 → 새 세션을 생성하고, 세션 ID를 쿠키로 클라이언트에 내려보낸다.

20210618_162204

getSession()이 세션 생성 + 쿠키 발급까지 한 번에 처리한다.

20210618_165901

로그인 성공 후 세션을 만들고, 성공 사실을 세션에 저장한다.


세션을 이용한 페이지 인증

A.jsp, B.jsp, C.jsp 같은 여러 페이지에서 session.getAttributeuserId를 꺼내 null이 아니면 인증된 사용자로 판단한다.

단, 동일한 브라우저(클라이언트)인 경우에만 같은 세션을 공유할 수 있다.

20210618_171040

브라우저세션메모리 공간
브라우저 Asession-100session-100 전용 메모리
브라우저 Bsession-200session-200 전용 메모리

모든 페이지가 세션 인증 여부를 비교·확인하는 것이 상태 인증 방법이다.

20210618_171806


로그아웃: 세션 제거

클라이언트가 서버에 요청할 때 요청 정보가 담기는 곳이 Request이다.

package kr.bit.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MemberLogoutController implements Controller {

    @Override
    public String requestHandler(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 세션을 가져와서 세션을 제거
        // 세션을 제거하는 방법
        // 1. 강제로
        String ctx = request.getContextPath();  // MVC06
        request.getSession().invalidate();
        // 2. 브라우저를 종료하는 것(JSESSIONID 브라우저 쿠키에 저장)
        // 3. 세션이 종료될 때까지 기다리는 것(세션 타임아웃: 30분 = 1800초)
        return "redirect:" + ctx + "/memberList.do";
    }
}

세션 제거 방법은 세 가지다.

방법설명
invalidate() 강제 제거즉시 세션 삭제
브라우저 종료JSESSIONID 쿠키가 소멸되어 세션 연결 끊김
세션 타임아웃 대기톰캣 기본값 30분(1800초), web.xml에서 설정 가능