ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][JSP] Session (세션)
    JSP 2020. 3. 13. 18:26

    1. Session(세션)이란?

     이전 포스팅에서 쿠키에 대해 공부하면서 클라이언트의 상태 값을 저장하는 방법을 배웠습니다. 그렇다면 세션은 무엇일까? 서버의 세션을 사용하면 쿠키와 유사하게 클라이언트의 상태 값을 저장할 수 있습니다. 쿠키와의 차이점이라고 한다면 세션은 웹 브라우저가 아닌 서버에 값이 저장된다는 것입니다. 그렇기 때문에 세션은 인증된 사용자 정보를 유지하기 위해 주로 사용됩니다. 

     

     웹 컨테이너는 하나의 웹 브라우저에 하나의 세션을 생섭합니다. 그렇기 때문에 같은 JSP 페이지일지라도 실행하는 웹 브라우저에 따라서 서로 다른 세션을 사용한다고 할 수 있습니다. 세션은 웹 브라우저마다 따로 존재하기 때문에 웹 브라우저와 관련된 정보를 1대1로 저장할 수 있는 장소입니다. 

     

     즉, 쿠키는 클라이언트의 데이터 저장 장소인 것이고, 세션은 서버의 데이터 저장 장소인 것입니다. 세션을 사용하기 위해서는 세션을 생성해야 하며 세션을 생성한 후에는 session 기본객체를 사용해 세션을 활용할 수 있습니다. 

     

     

    2. Session(세션) 생성

     세션을 생성하기 위해서는 아래와 같이 page 디렉티드의 session 속성을 true로 지정해주면 됩니다. 이 session의 속성값의 기본값은 true이기 때문에 따로 지정을 하지 않아도 false로 지정하지 않는다면 true로 자동으로 지정됩니다. 

    <%@ page contentType"text/html; charset=utf-8" %>
    <%@ page session="true" %>
    <%
    	...
    %>

     

     또 다른 방법으로는 request 기본객체의 getSession 메소드를 사용하는 방법이 있습니다. getSession 메소드는 현재 요청과 관련된 session 객체를 반환합니다. 이미 session이 생성되어 있는 경우 생성되어 있던 세션을 반환하며, 생성되어 있는 세션이 없는 경우 새로운 세션을 생성한 후 반환합니다. 

     간혹 이미 세션이 생성되어 있는 경우에만 사용하고 싶다면 getSession 메소드의 파마미터로 false를 전달해주면 되고 , 이 경우 반환 값은 null입니다. 

    <%@ page session="false" %>
    <%
    	HttpSession httpSession = request.getSession();
        	List sList = (List)httpSession.getAttribute("list");
        	sList.add(id);
    %>

     

    3. Session(세션) 활용

     세션을 사용한다는 것은 session 기본객체를 사용한다는 말을 의미하며, session 기본객체는 속성을 제공합니다. 이 속성을 읽어오거나 저장하기 위해서는 setAttribute, getAttribute 등의 메소드를 활용하면 됩니다. 

     

     또한, 세션은 세션만의 고유 정보를 제공합니다. 이 정보에 접근하기 위해서 사용되는 메소드는 아래와 같습니다. 

    Type and Method Description
    String getId( ) 세션의 고유 ID를 반환한다.
    long getCreationTime( ) 세션이 생성된 시간을 반환한다. 이때 생성된 시간은 기준시간으로 부터 흘러간 시간을 의미하며, 기준시간은 1970년 1월 1일이다. 단위는 1/1000초이다.
    long getLastAccessedTime( ) 웹 브라우저가 가장 최근에 세션에 접근한 시간을 반환한다. 이때 최근 접근 시간은 기준시간으로 부터 흘러간 시간을 의미하며, 기준시간은 1970년 1월 1일이다. 단위는 1/1000초이다.

     세션은 세션 ID를 통해서 웹 브라우저마다 가지고 있는 각각의 세션을 구분합니다. 웹 컨테이너는 웹 브라우저로 세션 ID를 전송하며, 웹 브라우저는 웹 컨테이너에 연결할 때마다 세션 ID를 전달함으로써 웹 브라우저가 사용할 세션을 판단하게 됩니다. 이 세션 ID는 쿠키를 통해서 웹 브라우저에 전달되게 됩니다. 

     

     session 기본객체를 사용할 때 최근 사용시간을 기록하는데, 그 이유는 세션의 타임아웃을 관리하기 위해서입니다. 

     

     세션은 지정된 시간동안 유효하기 때문에 실행하는 동안 지속적으로 사용해야 하는 데이터의 저장 장소로 사용됩니다. 그렇기 때문에 session 기본객체는 웹 브라우저의 다수의 요청을 처리하는 JSP 페이지 간에 공유가 가능합니다. 

     

     웹 브라우저와 1대1로 맵핑되는 회원 정보와 같은 값을 저장할 때 쿠키 대신 세션을 사용하기도 합니다. 쿠키 대신 세션을 사용하는 가장 큰 이유는 보안상 문제이기 때문입니다. 데이터는 네트워크를 통해서 전달되기 때문에  

     

     세션에 값을 저장할 때는 setAttribute 메소드는 사용하며, 읽어 올 때는 getAttirbute 메소드를 사용합니다. 이 메소드들의 간단한 사용 방법은 아래와 같습니다. 

     

    sessionSet.jsp

    <%@ page contentType"text/html; charset=utf-8" %>
    <%
    	session.setAttribute("ID", "Camel");
        	session.setAttribute("NAME", "낙타");
    %>
    <html>
    <head>세션 정보 저장</head>
    <body>
    세션 정보 저장
    </body>
    </html>

    sessionGet.jsp

    <%@ page contentType"text/html; charset=utf-8" %>
    <%
    	String name = (String)session.getAttribute("NAME");
    %>
    <html>
    <head>세션 정보 읽어오기</head>
    <body>
    세션 정보
    Name : <%= name %>
    </body>
    </html>

     

    4. Session(세션) 종료

     세션을 더 이상 유지할 필요가 없어져 세션의 종료를 원할 때는 session 기본객체의 invalidate 메소드를 사용하면 됩니다. 세션을 종료하게 되면 현재 사용중인 session 기본객체가 삭제되면서 기본객체에 저장되었던 속성 목록도 함께 삭제되게 됩니다. 세션 종료를 수행하는 invalidate 메소드의 사용방법은 아래와 같습니다. 

    <%@ page contentType"text/html; charset=utf-8" %>
    <%
    	session.invalidate();
    %>
    <html>
    <head>세션 종료</head>
    <body>
    세션 정보 삭제
    </body>
    </html>

     

     

    5. Session(세션) 유효시간

    세션은 최근 접근 시간이라는 것을 가지고 있습니다. 그렇기 때문에 session 기본객체가 사용될 때마다 세션의 최근 접근 시간이 갱신되게 됩니다. getLastAccessedTime 메소드는 최근에 session 기본객체에 접근한 시간을 반환하는 메소드입니다. 웹 브라우저가 JSP 페이지를 실행할 때마다 session 기본객체에 접근하게 되는데, 이 것은 웹 브라우저가 JSP 페이지를 실행할 때마다 세션의 최근 접근 시간이 갱신됨을 의미합니다. 

     

     세션의 유효시간이라 함은 마지막 접근 시간으로부터 지정된 시간 이내에 다시 세션에 접근하지 않는다면 세션이 종료되는 시간을 말합니다. 그렇기 때문에 만약 세션 유효시간을 10분으로 지정했는데 10분 이내에 다시 세션에 접근하지 않을 경우 세션은 종료되게 됩니다. 

     

     세션의 유효시간을 설정하는 방법은 두 가지가 있습니다. 

    1.  WEB-INF/web.xml 파일에서 <session-config> 태그를 사용한다. 
    2.  session 기본객체가 제공하는 setMaxInactiveInterval 메소드를 사용한다.

     첫 번째 <session-config> 태그를 사용하는 방법은 아래와 같이 사용할 수 있습니다. 아래의 예시는 세션 유효시간을 50분으로 지정하고 있습니다. 이 경우 유효시간을 지정하는 부분에 0이나 음수를 지정하게되면 세션은 유효시간을 갖지 않게되고 invalidate 메소드를 통해서만 세션을 종료할 수 있습니다. 이런 경우는 메모리 부족 문제로 연결될 가능성이 있습니다.

    <xml version="1.0" encoding="utf-8"?>
    
    <web-app xmlns="http://java.sun.com/xml/ns/javaee" .... version="3.0">
    
    	<session-config>
        		<session-timeout>50</session-timeout>
        	<session-config>
        
    </web-app>

     두 번째 setMaxInactiveInterval 메소드를 사용하는 방법은 아래와 같이 사용할 수 있습니다. 첫 번째 방법과의 차이점은 첫 번째 방법에서는 분 단위로 유효시간을 설정했다면, setMaxInactiveInterval 메소드를 사용하는 방법은 초 단위로 유효시간을 설정합니다. 

    <%
    	session.setMaxInactiveInterval(50);
    %>

     

    6. Session(세션)을 활용한 로그인 페이지

    세션을 사용해 로그인페이지를 만드는 방법은 쿠키를 사용해 만드는 방법과 유사합니다. 

    <%@ page contentType = "text/html; charset=utf-8" %>
    <%
    	session.setAttribute("ID", "Camel");
    	session.setAttribute("NAME", "낙타");
    %>
    <html>
    <head><title>세션에 정보 저장</title></head>
    <body>
    
    세션에 정보를 저장
    
    </body>
    </html>
    <%@ page contentType="text/html; charset=utf-8" %>
    <%
    	String id = request.getParameter("id");
    	Srting password = request.getParameter("password");
    	
        	// id와 password가 같으면 로그인 성공
    	if(id.equals(password)) {
    		session.setAttribute("ID", id);
    %>
    <html>
    <head> Login Success </head>
    <body>
    Login Success
    </body>
    </html>
    <%
    	} else {
    %>
    <script>
    		alert("Login Fail");
    		history.go(-1);
    </script>
    <%
    	}
    %>

    로그아웃 Page (sessionLogout.jsp)

    <%@ page contentType="text/html; charset=utf-8" %>
    <%
    	session.invalidate();
    %>
    <html>
    <head> Log out </head>
    <body>
    Log out Success
    </body>
    </html>

     

     

     

    댓글

Camel`s Tistory.