-
[WEB : Servlet] Session 세션비전공자 공부일기/:: WEB & Front-End 2019. 7. 3. 11:22
2019. 07. 03 필기
※ 쿠키에 대한 필기 -> (https://codingwanee.tistory.com/53)
※ 내용 참고하기 좋은 블로그 -> (https://victorydntmd.tistory.com/34)
세션 이해하기
세션(session)이란?
- 연결 지속성을 제공하기 위해 서버에 저장되는 정보
- 서버에 정보를 요청할 때 생성되는 상태정보
저번 포스팅에서 쿠키에 대해 공부한 필기 내용을 올렸는데, 쿠키와 세션은 비슷하지만 다음과 같은 점에서 다르다.
구분 쿠키 세션 저장위치 클라이언트 서버 저장 데이터 타입 텍스트(문자열) 객체 저장 데이터 크기 제한 있음 서버에서 수용 가능한 만큼 쿠키는 클라이언트에 정보가 저장되는 반면, 세션은 서버에 클라이언트의 정보가 저장된다고 했다. 따라서 세션은 클라이언트의 갯수만큼 만들어진다. 각 클라이언트들의 정보가 섞이면 안되기 때문이다. 하지만 결국 세션도 세션ID 등을 이용할 때 쿠키 기술을 사용한다.
세션에 대해 실생활 속 예시로 들자면, '로그인을 했냐 안했냐' 또는 '장바구니에 뭐가 담겼냐'로 생각하면 된다.
로그인을 한 상태와 비로그인 상태는 볼 수 있는 화면&정보가 다르다. 즉, 로그인 상태에 따라서 서버가 제공하는 응답페이지가 달라지게 된다.
세션의 디폴트 지속시간은 30분이지만, 시간을 임의로 늘리거나 줄일 수도 있는데 이 기능을 이용해서 '브라우저가 닫히면 로그인이 풀리게 하거나(유지시간이 0초)', '로그인 상태 유지를 체크하면 몇일, 몇달 동안도 로그인을 유지하게' 할 수 있다.(40년, 2000년 이렇게 엄청난 기간을 지정해놓는 곳도 있다)
세션ID(Session ID)란?
- 세션ID는 쿠키 기술로 클라이언트에 저장된다. JSESSIONID
세션 바인딩(Session Binding)이란?
- WAS의 컨테이너가 관리하는 세션을 서블릿에서 사용할 수 있도록 제공하는 작업
세션 트랙킹(Session Tracking)이란?
- 클라이언트에서 전달된 세션아이디와 동일한 세션을 찾는 작업
세션과 관련된 메소드 미리보기
- HttpServletRequest.getSession() : 세션(Session)을 바인딩하여 반환하는 메소드
--- 세션ID가 없거나 탐색이 실패한 경우 => 세션을 새로 생성하여 바인딩하고 반환
--- 클라이언트의 세션아이디에 해당하는 세션이 탐색된 경우 => 세션을 트랙킹(탐색)하여 바인딩하고 반환
--- 세션이 바인딩 되어야만 서블릿에서 세션 사용
--- 세션이 생성되어 바인딩된 경우, 세션ID를 클라이언트에 쿠키로(JSESSIONID) 전달하여 저장
- HttpSession : 클라이언트의 정보들을 세션명(String)과 세션값(Object)의 형태로 저장하기 위한 인스턴스 (일종의 맵)
- HttpServletRequest.getSession(boolean create) : 세션(Session)을 바인딩하여 반환하는 메소드
--- 매개변수에 false가 전달될 경우 세션 생성 불가능하고 탐색하여 바인딩 가능
--- true가 전달될 경우 세션 생성 및 세션 생성 및 탐색하여 바인딩 가능
- session.isNew() : 세션을 새로 생성해서 바인딩한 경우 true를 반환하는 메소드 / 트랙킹해 반환하면 false 반환
- session.getId() : 세션 아이디를 반환하는 메소드 --- 클라이언트에 저장된 JSESSIONID 쿠키값과 동일
- session.getCreationTime() : 세션 생성시간을 반환하는 메소드 --- 단위: 타임스탬프-밀리초
- session.getMaxInactiveInterval() : 세션 지속시간을 반환하는 메소드 --- 단위: 초
- session.setMaxInactiveInterval(초) : 세션 지속시간을 변경하는 메소드 --- 변경하지 않으면 디폴트는 30분
- HttpSession.setAttribute(String attributeName, Object attributeValue)
: 세션속성명(String)과 세션속성값(Object)를 한쌍으로 세션에 정보를 저장하는 메소드--- 세션 속성명이 중복될 경우 덮어씌우기가 된다.
--- 쿠키와 유사하나, value가 객체라는 점이 다름
- HttpSession.getAttribute(String attributeName) : 세션 속성명으로 세션속성값을 반환하는 메소드
--- 세션속성값을 Object 인스턴스로 반환하므로 객체형변환하여 사용
--- 세션속성명이 없는 경우 null 반환 --- ex) null이면 로그인이 안 되어있는 상태
클라이언트에 대한 세션을 생성하여 응답문서로 제공하는 서블릿
@WebServlet("/session.itwill") public class SessionServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out=response.getWriter(); HttpSession session=request.getSession(); out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet</title>"); out.println("<style>"); out.println("p {color: #FF00CC;}"); out.println("</style>"); out.println("</head>"); out.println("<body>"); out.println("<h1>세션(Session)</h1>"); out.println("<hr>"); if(session.isNew()) { out.println("<p>세션을 생성하여 바인딩 되었습니다.</p>"); } else { out.println("<p>세션을 트랙킹하여 바인딩 되었습니다.</p>"); //수동으로 JSESSIONID의 쿠키를 생성하여 클라이언트 전달 << 덮어씌우기 --- 이렇게 하지 않으면 브라우저가 닫히는 순간 소멸 // => JSESSIONID의 쿠키 지속시간 변경 Cookie cookie=new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(60*60*24); response.addCookie(cookie); } out.println("<p>세션 아이디 = "+session.getId()); out.println("<p>세션 생성시간 = "+session.getCreationTime()); out.println("<p>세션 지속시간 = "+session.getMaxInactiveInterval()); out.println("<hr>"); out.println("</body>"); out.println("</html>"); } }
---------
<< 다음날 쌤의 아침요약 내용 >>
...더보기WAS가 http 세션을 만들어준다.
웹 어플리케이션을 서블릿으로 만들어주고, 이 서블릿을 인스턴스로 만들어 메소드로 호출하는게 WAS이다. 이 서블릿 안에서 Date, Array 등등의 인스턴스를 만드는 것도 모두 WAS가 하는 일이다.
서블릿은 한 번 만들어 놓으면 WAS가 종료될 때까지 계속 인스턴스가 만들어져 있다. 세션 역시 WAS가 관리한다. 클라이언트가 요청을 했을 때 클라이언트가 요청한 서버 안에서는 세션이 필요하다고 WAS에게 요청한다(이것이 getSession()). 그런데 세션이 있어야 세션을 준다. 그래서 우선은 세션이 있는지 없는지 트랙킹을 해보고, 없으면 새로 생성해 주고 있으면 그걸로 갖다준다. 트랙킹은 세션ID로 한다. 이 세션ID는 클라이언트의 정보를 따로따로 저장해야 하기 때문에 클라이언트를 구분하기 위해 필요하다. 이 세션ID를 통해서 해당 클라이언트에 세션이 있는지 찾아준다. 클라이언트 요청이 최초로 발생했을 때는 세션이 없으니까 생성해서 만들어준다.(바인딩) 그런데 만들어주고 끝나는 게 아니라 WAS는 세션ID를 클라이언트에게 전달해준다. JSESSION이라는 이름의 쿠키로 전달해준다. 트랙킹해서 세션ID랑 똑같은 애를 찾으면 걔를 갖다줌. 즉, 한 번 만들어진 세션은 모든 서블릿이 이용할 수 있다.
세션에는 문자열 뿐만 아니라 객체를 저장할 수 있다. 따라서 복합적인 정보들(제품정보, 회원정보 등)을 만들 수 있다. 그리고 이를 응용해 로그인 상태에 따라 응답문서가 다르게 등을 설정할 수 있다. 세션은 인증, 권한의 분야, 즉 로그인이나 장바구니 등에 사용된다.
getSession()도 파라미터를 가질 수 있는데, 잘 안쓴다.'비전공자 공부일기 > :: WEB & Front-End' 카테고리의 다른 글
[WEB : JSP] error - 에러메시지를 띄우는 방법 세 가지 (2) 2019.07.08 [WEB : Servlet] JDBC 연동 - (1) (3) 2019.07.03 [WEB : Servlet] Cookie 쿠키(생성, 읽기, 제거) (5) 2019.07.02 Servlet - 파일 업로드 (0) 2019.07.02 웹개발 - 서블릿 생명주기 Servlet Life Cycle (3) 2019.07.02