-
JSP 피피티 04강 SessionJSP 피피티 2020. 8. 23. 18:51
세션이란
통신 전반적인 측면에서의 클라이언트와 서버간의 연결 단위.
ex) 만약 웹 사이트에 5명의 사용자가 접속한 상태라면 "5개의 세션이 생성되었다." 라고 한다.
JSP에서 세션의 의미
-각 클라이언트마다 데이터를 저장 할 수 있는 서버 상의 임시공간.
-웹 서버는 사용자가 접속하면 자신의 메모리 공간에 각각의 사용자 별로 구분되는 저장공간을 생성한다.
-이 저장 공간은 브라우저가 닫히거나 지정된 시간 동안 페이지 이동이 발생하지 않을 경우 자동으로 삭제 된다.
세션과 쿠키의 비교
Cookie Session 지속성 지정된 시간 혹은 브라우저가 웹 사이트에 접속되어 있는 동안 변수값이 유지된다. 브라우저가 웹 사이트에 접속되어 있는 동안만 변수 값이 유지된다. 지정된 시간 동안 페이지 이동이 발생하지 않으면 자동으로 삭제된다. 저장위치 사용자의 컴퓨터에 텍스트 파일 형태로 저장된다. 웹 서버가 직접 메모리에 저장한다.
(브라우저에게 정보가 전송되지 않는다.)
(톰켓이 자기 메모리에 저장)장점 사용자 브라우저에 저장하기 때문에 서버에 부담이 없다. 서버에 직접 저장하기 때문에 보안에 대한 걱정이 없다. 단점 사용자 브라우저에 저장하기 때문에 보안에 취약하다. "사용된 변수 X 접속자 수" 만큼의 변수를 서버메모리에 직접 저장하기 때문에 많은 값을 저장할 경우 서버에 부담이 된다. 브라우저에 기록된 세션 아이디
-웹 서버는 접속한 사용자를 구분하기 위해 메모리 영역을 할당한다.
-이 메모리 영역을 의미하는 JSESSIONID를 발급하여 브라우저에 쿠키로 저장시킨다.
-JSESSIONID는 서버에 해당 사용자에 대한 데이터가 저장되어 있지 않더라도, 각 사용자를 구분하기 위해 항상 생성된다.
어제 쿠키 예제하면서 캡처한건데 세션은 구냥 자동으로 생기는 건가??
웹 서버가 세션을 유지하는 방법
-브라우저는 다른 페이지에 접근할 때 최초 접속 시 발급 받았던 'JSESSIONID`를 웹 서버로 재전송한다.
-웹 서버는 이 값을 전달받아 해당 사용자에 대한 정보가 기록되어 있는 메모리 영역에 접근한다.
세션 더보기
더보기세션 ( Session )
일정 시간동안 같은 사용자(브라우저)로부터 들어오는
일련의 요구를 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술이다.여기서 일정 시간은 방문자가 웹 브라우저를 통해
웹 서버에 접속한 시점으로부터 웹 브라우저를 종료하여 연결을 끝내는 시점을 말한다.
즉, 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 한다.- 세션은 쿠키를 기반하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리합니다.
- 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지합니다.
- 물론 접속 시간에 제한을 두어 일정 시간 응답이 없다면 정보가 유지되지 않게 설정이 가능 합니다.
- 사용자에 대한 정보를 서버에 두기 때문에 쿠키보다 보안에 좋지만, 사용자가 많아질수록 서버 메모리를 많이 차지하게 됩니다.
- 즉 동접자 수가 많은 웹 사이트인 경우 서버에 과부하를 주게 되므로 성능 저하의 요인이 됩니다.
- 클라이언트가 Request를 보내면, 해당 서버의 엔진이 클라이언트에게 유일한 ID를 부여하는 데 이것이 세션ID다.
Request-header(요청헤더) 사진출처:https://goddaehee.tistory.com/169
세션의 동작방식
- 클라이언트가 페이지를 요청한다. (사용자가 웹사이트 접근)
- 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인하여,
클라이언트가 해당 session-id를 보냈는지 확인한다. - session-id가 존재하지 않는다면,
서버는 session-id를 생성해 클라이언트에게 돌려준다. - 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장한다.
쿠키 이름 : JSESSIONID - 클라이언트는 재접속 시,
이 쿠키(JSESSIONID)를 이용하여 session-id 값을 서버에 전달 - 서버는 세션 ID를 전달받아서 별다른 작업없이 세션 ID로 세션에 있는 클라이언트 정보를 가져온다.
- 클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답합니다.
세션의 특징
- 각 클라이언트에게 고유 ID를 부여
- 세션 ID로 클라이언트를 구분해서 클라이언트의 요구에 맞는 서비스를 제공
- 보안 면에서 쿠키보다 우수
- 사용자가 많아질수록 서버 메모리를 많이 차지하게 됨
세션의 사용 예
- 로그인 같이 보안상 중요한 작업을 수행할 때 사용
출처: https://interconnection.tistory.com/74 [라이언 서버]세션의 사용
세션은 사용자의 정보를 유지하기 위해 javax.servlet.http 패키지의 HttpSession 인터페이스를 구현해서 사용한다.
세션은 웹 브라우저 당 1개씩 생성되어 웹 컨테이너에 저장된다.
웬 서버는 각각의 웹 브라우저로부터 발생한 요청에 대해서 특별한 ID를 부여한다. 이후에 이 ID를 웹 브라우저에서 발생한 요청들과 비교해서 같은 ID인지 구별하게 된다. 이 ID에 특정한 값을 넣을 수 있으며, 이것을 사용해서 세션을 유지 하게 된다.
세션 메소드 리스트
메소드 이름 리턴 타입 설명 getAttribute(String name) java.lang.Object 세션 속성명이 name인 속성의 값을 Object 타입으로 리턴한다. 해당 되는 속성명이 없을 경우에는 null 값을 리턴한다. getAttributeNames() java.util.Enumeration 세션 속성의 이름들을 Enumeration 객체 타입으로 리턴한다. getCreationTime() long 1970년 1월 1일 0시 0초를 기준으로 하여 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000초 값으로 리턴한다.
getId() java.lang.String 세션에 할당된 고유 식별자를 String 타입으로 리턴한다. getMaxInactiveInterval() int 현재 생성된 세션을 유지하기 위해 설정된 세션 유지시간을 int형으로 리턴한다. invalidate() void 현재 생성된 세션을 무효화 시킨다. removeAttribute(String.name) void 세션 속성명이 name인 속성을 제거한다. setAttribute(String name, Object value) void 세션 속성명이 name인 속성에 속성값으로 value를 할당한다. setMaxInactiveInterval(int interval) void 세션을 유지하기 위한 세션 유지시간을 초 단위로 설정한다. 3.세션의 속성
-세션의 속성 설정은 session 객체의 setAttribute() 메소드를 사용한다.
session.setAttribute("id","value");
이때 주의할 사항은 세션의 속성 값은 객체 형태만 올 수 있다는 것이다.
session 객체는 웹 브라우저와 매핑되므로?? 해당 웹 브라우저를 닫지 않는 한 같은 창에서 열려진 페이지는 모두 같은 session 객체를 공유하게 된다. 따라서 session 객체의 setAttribute() 메소드를 사용해서 세션의 속성을 지정하게 되면 계속 상태를 유지하는 기능을 사용할 수 있게 된다.
-세션의 속성을 사용하려면 session 객체의 getAttribute()메소드를 사용한다.
String id= (String)session.getAttribute("id");
getAttribute()메소드는 리턴 타입이 Object 타입이므로 사용 시 실제 할당된 객체 타입으로 형변환(casting)을 해야한다.
-세션의 속성을 삭제 하려면 session 객체의 remove.Attribute()메소드를 사용한다.
session.removeAttribute("id");
-세션의 모든 속성을 삭제할 때는 session 객체의 invalidate()메소드를 사용한다.
session.invalidate();
세션 로그인 예제 더보기
더보기-세션 설정 (로그인 성공시에 로그인 아이디를 세션에 저장한다.
<%@ page language ="java" contentType="text/html; charset=EUC-KR" pageEncoding="UTF-8"%> <% request.setCharacterEncoding("UTF-8");%> <% // request에서 id 파라미터를 가져온다 String id = request.getParameter("id"); // request에서 passwd 파라미터를 가져온다. String passwd = request.getparameter("passwd"); --- 로그인 처리 ... 로그인 성공시 check 는 TRUE -- if(check){ // 로그인 성공시 // 세션에 "id" 이름으로 id 등록 session.setAttribute("id", id); // 로그인 성공 메인페이지 이동 response.sendRedirect("main.jsp"); }else{%> // 로그인 실패 <script> alert("로그인 실패"); // 이전 페이지로 이동 history.go(-1); </script> <%}%>
-세션 가져오기(세션에서 아이디를 가져와 로그인 상태를 인증하고, 값이 없을 경우 로그인 페이지로 넘긴다.
<%@ page language ="java" contentType="text/html; charset=EUC-KR" pageEncoding="UTF-8"%> <% request.setCharacterEncoding("UTF-8");%> <% String id = ""; try{ // request에서 id 파라미터를 가져온다 id = (String)session.getAttribute("id"); // id가 Null 이거나 없을 경우 if(id==null||id.equals(""){ // 로그인 페이지로 리다이렉트 한다. response.sendRedirect("loginform.jsp"); } } %>
-세션 제거하기(로그아웃 시 현재의 세션 정보를 제거한다.)
<%@ page language ="java" contentType="text/html; charset=EUC-KR" pageEncoding="UTF-8 <% session.invalidate(); %> // 세션 정보 제거 <script> alert("로그아웃 되었습니다."); // 로그아웃 페이지로 이동 location.href="logout.jsp"; </script>
세션에 저장하기 위한 입력값을 action 페이지로 전송
session.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <% //세션 유효시간 설정(초단위, 기본값 5분 ) -> 모든 페이지마다 개별 설정함. session.setMaxInactiveInterval(60); //"mysession"이라는 이름으로 저장된 Session 객체 추출 //-> Object 타입으로 형변환 되어 저장되므로, // 추출시에는 원래의 형태로 명시적 변환이 필요하다. String mySession = (String) session.getAttribute("mysession"); %> <!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Hello JSP</title> </head> <body> <h1>세션 예제</h1> <% //추출된 세션갑(mySession)의 존재 여부에 따라 출력처리 분기 if(mySession == null || mySession.equals("")){ out.println("<h2>mySession값 없음</h2>"); }else{ out.println("<h2>mySession=" + mySession + "</h2>"); } %> <form method="post" action="session_ok.jsp"> <label for="user_input">저장할 내용 입력</label> <input type="text" name="user_input" id="user_input"/> <button type="submit">세션저장</button> </form> </body> </html>
session은 JSP 내장객체이므로 별도의 생성과정 없이 바로 사용가능. 주소창에 session.jsp를 입력하여 request하면 서버에서 앞으로 세션값을 저장할 JSESSIONID라는 이름의 쿠키를 함께 response 한다.
session_ok.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <% //파리미터 수신에 사용할 문자셋 설정 (각 페이지당 최 상단에서 1회 설정) request.setCharacterEncoding("UTF-8"); //세션 유효시간 설정(초단위, 기본값 5분) -> 모든 페이지마다 개별 설정함. session.setMaxInactiveInterval(60); //session은 내장 객체이므로 별도의 생성과정 없이 바로 사용가능 //사용자 입력값 받기 String input = request.getParameter("user_input"); if(input != null && !input.equals("")){ //세션 저장(key,value형식) --> 모든 타입의 객체를 저장할 수 있다. session.setAttribute("mysession",input); }else{ //개별 세션 삭제 session.removeAttribute("mysession"); //저장된 세션 데이터를 개별적으로 삭제하기 위해 removeArrtibute(key)메서드를 사용한다. //현재 사용자에게 종속된 모든 세션 데이터를 일괄 삭제하기 위해서는 invalidate() 메서드를 사용한다. } //페이지 강제 이동 response.sendRedirect("session.jsp"); %> <!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Hello JSP</title> </head> <body> </body> </html>
session.jsp 의 <input >태그에 값을 입력하면 session_ok.jsp 페이지에서 입력받은 값('wwwee')으로 'mysession'이라는 이름의 세션을 생성하고 response.sendRedirect("session.jsp")를 실행하면서 생성된 세션값을 전달하는거 같다. session.jsp에서 생성된 세션값을 String으로 받아 else구문을 실행해 세션값을 출력한다.
세션활용
회원 정보를 위한 JavaBeans 구성
Member.java
package study.helloweb.model; import lombok.Data; /*회원정보를 저장하기 위한 클래스*/ @Data public class Member { /* 아이디 */ private String userId; /* 비밀번호 */ private String userPw; /* 이름 */ private String userName; /* 이메일 */ private String email; }
로그인을 위한 아이디, 비밀번호 입력 폼 구성
login.jsp
<%@page import="study.helloweb.model.Member"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <% // 세션값 가져오기 Member loginInfo = (Member) session.getAttribute("login_info"); %> <!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Hello JSP</title> </head> <body> <% if (loginInfo == null) { // 세션에서 획득한 객체가 없는 경우는 로그인 상태 아님 // --> 아이디, 비밀번호 입력폼을 표시 %> <form method="post" action="login_ok.jsp"> <div> <input type="text" name="user_id" placeholder="아이디" /> </div> <div> <input type="password" name="user_pw" placeholder="비밀번호" /> </div> <button type="submit">로그인</button> </form> <% } else { // 그렇지 않은 경우(세션정보가 존재할 경우)는 로그인 중 // --> 세션에서 획득한 Member 객체로 원하는 정보 표시 %> <h2>안녕하세요 <%=loginInfo.getUserName() %>님</h2> <h3> <%=loginInfo.getEmail() %></h3> <a href="logout.jsp" class="btn btn-warning">로그아웃</a> <% } %> </body> </html>
클라이언트가 login.jsp를 주소창에 입력하고 엔터 쳤을때 서버에서는 사용자를 구분하기 위하여 임시쿠키 하나를 보내 저장하도록 한다. 아래와 같이 JSESSIONID라는 쿠키가 생성되었다. 쿠키만 있지 아직 세션이 생성된 것은 아닌듯 하다.
login_ok.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <%@page import="study.helloweb.model.Member"%> <% // 파라미터 수신에 사용할 문자셋 설정 (각 페이지당 최 상단에서 1회 설정) request.setCharacterEncoding("UTF-8"); // 현재 시스템에 가입되어 있는 회원정보를 가정하여 Beans 객체 생성 Member member = new Member(); member.setUserId("jspuser"); member.setUserPw("123abc!@#"); member.setUserName("JSP학생"); member.setEmail("jspuser@itpaper.co.kr"); // 사용자 입력값 String userId = request.getParameter("user_id"); String userPw = request.getParameter("user_pw"); // 필수 값의 존재여부 검사 if (userId == null || userId.equals("")) { // 메시지 박스를 출력하고 이전 페이지로 이동하도록 자바스크립트 출력 out.print("<script>alert('아이디를 입력하세요.');history.back();</script>"); // 현재 페이지의 실행 중단 return; } if (userPw == null || userPw.equals("")) { out.print("<script>alert('비밀번호를 입력하세요.');history.back();</script>"); return; } // 아이디와 비밀번호가 가입된 정보와 일치하는 지 검사 // --> 여기서는 특정 문자열과 동일한 경우 가입된 아이디로 판단. if (!userId.equals(member.getUserId()) || !userPw.equals(member.getUserPw())) { out.print("<script>alert('아이디나 비밀번호가 잘못되었습니다.');history.back();</script>"); return; } // 모든 조건을 충족할 경우 로그인 처리 --> 세션 생성 session.setAttribute("login_info", member); // 원래 페이지로 돌아가기 response.sendRedirect("login.jsp"); %>
아이디 입력창에 "jspuser"를 입력하고, 비밀번호에 "123abc!@#"입력하고 로그인버튼을 누르면 login_ok.jsp페이지로 입력값과 비어있는? 세션ID쿠키를 전달 > 모든 유효성 검사를 거치고 member빈즈에 세팅되어있는 값을 세션의 속성으로 설정(세션이 생성) > login.jsp페이지 이동 생성된 세션도 함께 .
세션이 생성되어 login.jsp에서 else 구문 실행함.
현재 사용자에게 종속된 모든 세션 데이터를 일괄 삭제한 후 다시 원래의 페이지로 이동한다.
logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <% // 모든 세션값을 삭제하고 돌아가기 session.invalidate(); //response.sendRedirect("login.jsp"); --> 에러가 발생하지는 않지만 // 메서드가 호출된 이후의 모든 출력문 및 HTML태그는 // 웹 브라우저에게 전달되지 않는다. // 그러므로 추가된 코드는 동작하지 않는다. %> <!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Hello JSP</title> <script> alert("안녕히가세요."); </script> <!-- HTML을 활용한 또 다른 페이지 강제 이동 방법 --> <meta http-equiv="refresh" content="0; url=login.jsp" /> </head> <body> </body> </html>
※에러가 발생하지는 않지만 response.sendRedirect(...)메서드가 호출된 이후의 모든 출력문 및 HTML 태그는 웹 브라우저에게 전달되지 않는다. 그러므로 추가된 코드는 동작하지 않는다. 위의 코드에서는 response.sendRedirect(...)를 주석처리 해놓았고 body태그안 meta태그로 인해 페이지가 이동한다.
로그 아웃을 누르면 session.invalidate()로 모든 세션값을 지우고 다시 원래페이지로 이동.
로그인 하기전, 로그인 상태, 로그아웃 후 세션값이 모두 다르다. 위에 입력칸에 값이 남아있는건 크롬브라우저에서 로그인 정보를 저장했기 때문. 그 이유는 각각의 과정을 거치는 동안 오랜 시간이 흘렀고 세션이 만료되어 새로 바뀐듯. 아 로그아웃 할때마다 바뀌는건 확실히다. 왜냐면 세션을 지웠으니까!!
'JSP 피피티' 카테고리의 다른 글
JSP 피피티 07강 Spring Interceptor (0) 2020.09.01 JSP 피피티 07 Spring Framework (0) 2020.08.31 JSP 피피티 06강 쿠키 (0) 2020.08.23 JSP 피피티 03강 POST방식의 데이터 전송 (0) 2020.08.22 JSP 피피티 02강 GET방식의 데이터 전송(JSP내장객체) (0) 2020.08.21