본문 바로가기
Back/Servlet

쿠키와 세션 - 세션을 이용한 웹 페이지 연동 기능

by Hyeon_ 2021. 12. 30.

쿠키와 세션 - 세션을 이용한 웹 페이지 연동 기능

세션은 웹 페이지들 사이의 공유 정보를 서버에 저장해 두고 웹 페이지들을 매개해 주는 방법이라는 점에서 쿠키와 동일하다. 하지만 쿠키는 사용 시 웹 페이지들의 정보가 클라이언트 PC에 저장되므로 정보가 쉽게 노출될 수 있다는 단점이 있으나, 세션은 서버의 메모리에 생성되어 정보를 저장한다.

 


세션(Session)이란?

  • 클라이언트와 웹 서버 간에 네트워크로 연결이 지속적으로 유지되고 있는 상태

 

세션의 특징

  • 정보가 서버의 메모리에 저장
  • 브라우저의 세션 연동은 세션 쿠키를 이용
  • 쿠키보다 보안에 유리함
  • 서버에 부하를 줄 수 있음
  • 브라우저(사용자)당 한 개의 세션(세션 id)이 생성
  • 유효시간을 가짐 (기본 유효시간 : 30분)
  • 로그인 상태 유지 기능이나 쇼핑몰의 장바구니 담기 기능 등에 주로 사용

세션의 생성 및 저장 과정

  • 클라이언트가 서버에 페이지 요청ㅊ
  • Session 자동 생성
  • Session 속성 설정
    • Session 내부 객체의 메소드 사용

세션 id

클라이언트가 처음 접속하면 서버의 서블릿은 세션 객체를 생성한 후 세션 객체에 대한 세션 id를 브라우저에 전송한다. 그러면 브라우저는 세션 id를 브라우저가 사용하는 세션 쿠키에 저장한다.

즉, 서버로부터 전송된 세선 id도 쿠키이며, 쿠키 이름은 jsessionId이다.

재접속하여 세션 쿠키에 저장된 세션 id(jsessionId)를 다시 서버로 전송하면 서버에서는 전송된 세션 id를 이용해 브라우저의 세션 객체에 접근하여 브라우저에 대한 작업 수행

F12 개발자도구 > Application > Cookies에서 확인 가능

세션 API의 특징과 기능

서블릿에서 세션을 이용하려면 HttpSession 클래스 객체를 생성해서 사용해야 함.

HttpSession객체는 HttpServletRequest의 getSession() 메서드 호출해서 생성

getSession() 메서드

  • getSession() : 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성
  • getSession(true) : 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성.
  • getSession(false) : 기존의 세션 객체가 존재하면 반환하고, 없으면 null 반환

세션 관련 메서드

  • setAttribute(이름, 값) : 세션 이름과 값 설정
  • getAttribute(이름) : 이름에 해당된 값 반환
  • getAttributeNames() : 모든 세션 이름 반환
  • getId() : 세션 ID 반환
  • isNew() : 새로 생성되었는지 여부 반환
  • getMaxInactiveInterval() : 설정된 유효기간 반환
  • removeAttribute() : 설정된 속성값 제거
  • invalidate() : 실행 중인 세션 종료. 모든 데이터 삭제. 로그아웃 시 사용
  • isRequestedSessionIdValid() : 유효한 세션 ID가 있는 여부 반환

세션 값 설정

  • session.setAttribute(“SID”, “abcd”);
  • session : 내장 객체

세션 값 알아오기

  • Object obj = session.getAttribute(“SID”);
  • Object 타입 반환 (사용 시 형 변환)

세션 속성 제거

  • session.invalidate()
  • 또는 설정된 유효 기간이 만료되면 종료

세션 무효화

  • invalidate() 메소드를 사용해서 바로 무효화시킬 수 있음
  • web.xml 파일에서 session-timeout 설정해서 시간을 정할 수 있음
  • setMaxInactiveInterval()를 사용해서 시간 지정 가능
  • 기본 세션은 마지막 요청으로부터 30분 경과 후 자동 소멸됨
    • 세션 유효 기간을 따로 설정하지 않으면 톰캣에서 설정한 기본 유효 시간 30분이 적용

 


 

세션 API 이용하기 예제

SessionTest
  • session id, 최소 생성 시간, 접근 시간, 유효 시간, isNet() 확인
  • 유효시간을 따로 설정하지 않으면 톰캣이 정한 기본 유효시간 30분이 적용
@WebServlet("/sess")
public class SessionTest extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();

        out.println("세션 아이디 : " + session.getId() + "<br>");
        out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
        out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
        out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");

        if(session.isNew()) {
            out.print("새 세션이 만들어졌습니다");
        }
    }
}
SessionTest2
@WebServlet(name = "SessionTest2", value = "/sess2")
public class SessionTest2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();

        out.println("세션 아이디 : " + session.getId() + "<br>");
        out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
        out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");

        out.println("기본 세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
        // 세션 유효시간 5초
        session.setMaxInactiveInterval(5); 
        out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");

        if(session.isNew()) {
            out.print("새 세션이 만들어졌습니다");
        }
    }
}
SessionTest3
  • invalidate() 호출해서 세션 강제 삭제
@WebServlet(name = "SessionTest3", value = "/sess3")
public class SessionTest3 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();

        out.println("세션 아이디 : " + session.getId() + "<br>");
        out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
        out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
        out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");

        if(session.isNew()) {
            out.print("새 세션이 만들어졌습니다");
        }

        session.invalidate();
    }
}