오봉이와 함께하는 개발 블로그

Servlet - 세션 트래킹(웹 페이지 사이 정보 공유) Session 세션 본문

BE/Servlet

Servlet - 세션 트래킹(웹 페이지 사이 정보 공유) Session 세션

오봉봉이 2021. 12. 29. 18:08
728x90

쿠키와 세션

  • 클라이언트와 서버 간에 정보를 교환하는데 클라이언트 PC 또는 서버의 메모리에 저장해 두고 사용하면 프로그램 속도를 향상시킬 수 있음HTTP 프로토콜
  • 서버-클라이언트 통신 시 stateless 방식으로 통신
  • 브라우저에서 새 웹페이지를 열면 기존의 웹페이나 서블릿에 관한 어떤 연결 정보도 유지 않음
  • 새로 열린 페이지에서 어떤 정보도 알 수 없음
  • 페이지가 서로 독립적이어서 서로의 상태를 알 수 없음
  • 웹 페이지 사이 또는 서블릿 간 상태나 정보를 공유하려면 웹 페이지를 연결시키는 기능 필요
    • 세션 트래킹이라고 함
      • 방법
        1. 세션
          • 서버 메모리에 정보를 저장한 후 웹페이지 공유
          • 클라이언트와 웹 서버 간에 네트워크로 연결이 지속적으로 유지되고 있는 상태
          • 쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단
          • 쿠키와 달리 클라이언트 측에 저장되는 것이 아니라 서버 상에 객체로 존재
            • 따라서 세션은 서버에서만 접근이 가능하여 보안이 좋음
          • 서버에서 사용자의 정보를 유지 관리
          • 사용자 인증 후 여러 페이지에 걸쳐 정보를 공유해서 사용할 수 있게 해줌
          • Session은 서버 측에서만 설정이 가능
          • 브라우저 당 한 개씩 생성
          • 세션 생성 및 사용 과정
            • 클라이언트가 서버에 페이지 요청
            • Session 자동 생성
            • Session 속성 설정
              • session 내부 객체의 메소드 사용
          • 세션 ID
            • 클라이언트가 처음 접속하면 서버(컨테이너)로 부터 유일한 ID를 부여 받게 되는데 이를 세션 ID라고 하고 클라이언트가 재 접속했을 때 클라이언트를 구분하기 위한 수단이 된다.
            • 서블릿에서 생성된 세션 id는, 브라우저로 전송되어 세션 쿠키에 쿠키 이름 sessionID로 저장됨
            • F12 개발자도구 / Application / Cookies에서 확인 가능
          • 세션 관련 메소드
            • 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분이 적용

세션 방식 예제 1(세션 아이디, 최소 생성 시간, 접근 시간, 유효 시간, isNet() 확인) - SessionTest.java

@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("새 세션이 만들어졌습니다");
        }
    }
}

세션 방식 예제 2(세션 유효 시간 5초로 설정) - SessionTest2.java

@WebServlet("/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>");
        session.setMaxInactiveInterval(5);        // 세션 유효 시간을 5초로 설정
        out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");

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

세션 방식 예제 3(invalidate() 호출해서 사용자가 세션을 강제로 삭제) - SessionTest3.java

@WebServlet("/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();// 생성된 세션 객체를 강제로 삭제
    }
}

세션 이용해서 로그인/로그아웃 기능 - sessionLogin.html, LoginLogout.java, SessionLogout.java

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>로그인창</title>
    </head>
    <body>
      <form name="frmLogin" method="post" action="logInOut" >
           아이디  :<input type="text" name="user_id"><br>
         비밀번호:<input type="password" name="user_pw" ><br>
        <input type="submit" value="로그인">  <input type="reset" value="다시입력">        
      </form>
    </body>
</html>
@WebServlet("/logInOut")
public class LoginLogout extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response);
    }

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

        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");

        // 처음 접속이면
        if(session.isNew()) {
            // user_id 입력 값이 있으면
            if(user_id != null) {
                // SID 이름, user_id 값으로 세션 변수 설정
                session.setAttribute("SID", user_id);
                // 다시 실행시켜서 SID 확인
                out.print("<a href='logInOut'>로그인 상태 확인</a>");
            }else { // user_id 입력 값이 없으면
                out.print("<a href='sessionLogin.html'>다시 로그인 하세요!</a>");
                session.invalidate();
            }

        } else {   //아니고 세션이 있으면
            user_id = (String) session.getAttribute("SID");
            if(user_id != null && user_id.length() != 0) {
                out.print("안녕하세요 " + user_id + "님!!");
                out.print("<br><a href='logout'>로그아웃</a>");
            } else {
                out.print("<a href='sessionLogin.html'>다시 로그인 하세요!</a>");
                session.invalidate();
            }
        }
    }
}
@WebServlet("/logout")
public class SessionLogout 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();

        session.invalidate(); // 세션 무효화

        out.print("로그아웃 되었습니다. <br>");
        out.print("<a href='sessionLogin.html'>로그인</a>");
    }
}
728x90
Comments