본문 바로가기
IT/JSP

[JSP] - 28. Session(세션) 사용 방법(쿠키vs세션 차이점)

by 차이나는 개발자 2020. 7. 28.
728x90
반응형

#Session(세션) 사용 방법(쿠키vs세션 차이점)

 

 

#세션

-서버에서 사용자의 정보(상태)를 저장한다.

-쿠키와 같이 서버와의 관계를 유지하기 위한 수단이다.

-클라이언트의 요청이 발생하면 자동 생성된다.

-쿠키와 달리 클라이언트의 특정 위치에 저장되는 것이 아니라, 서버 상에 객체로 존재한다.

-쿠키와 달리 서버에서만 접근이 가능하여 보안이 좋다.

-Session의 영역상 브라우저의 X 버튼을 누를 때까지 유지된다.

-e.g.) 로그인 정보나 사용자 환경설정, DB커넥션 등 정보를 유지하는 것들에 사용된다.

 

 

#페이지 내에서 세션의 기본 값

<%@ page session = "true" %>

 

 

#세션 관련 메서드

메서드 설명
setAttribute(String attrName, Object attrValue) 세션에 데이터를 저장한다.
getAttribute(String attrName) 세션에서 파라미터로 지정된 이름의
속성 데이터 값을 얻는다.
getAttributeNames() 세션에 저장되어 있는 모든 데이터의 이름
(유니크한 키 값)을 얻는다.
getId() 자동 생성된 세션의 유니크한 아이디를 얻는다.
(각 브라우저에 해당하는 값)
isNew() 세션이 최초 생성되었는지,
이전에 생성된 세션인지를 구분한다.
setMaxInactiveInterval(int second) 세션의 유효시간을 설정한다.
getMaxInactiveInterval() 세션의 유효시간을 얻는다. 
가장 최근 요청시점을 기준으로 카운트 된다.
removeAttribute(String attrName) 세션에서 특정 데이터(파라미터 값)제거.
(세션을 제거하는 것이 아니라 값을 삭제한다.)
invalidate() 세션의 모든 데이터를 삭제한다.

 

메서드 설명
getCreationTime() 세션이 생성된 시간을 구한다. 시간은 1970년 1월 1일 이후 흘러간 시간을 의미하며, 단위는 1/1000초이다.
getLastAccessedTime() 웹 브라우저가 가장 마지막에 세션에 접근한 시간을 구한다.
시간은 1970년 1월 1일 이후 흘러간 시간을 의미하며,
단위는 1/1000초이다.

#세션 종료 invalidate()

-바로 소멸시킨다는 의미가 아니다.

-아이디 값을 제외한 나머지 정보를 접근할 수 없다.

-invalidate() 후 세션의 아이디 값은 받아 올 수 있지만 나머지 정보나 속성 등은 접근할 수가 없다. 

(아이디 값을 받아 올 수 있다는 의미는 현재 페이지에서 세션이 사라진 것은 아니다.

-session.getSession() 메서드를 사용해서 다음 페이지에 얻어 와야 하는 세션을 미리 얻어올 수 있다.

 

 

#request.getSession()

-HttpSession을 생성하는 방법

-현재 요청과 관련된 session객체를 리턴한다.

 

-request.getSession()메서드는 session이 존재하면 해당 session을 리턴하고 존재하지 
않으면 새롭게 session을 생성해서 리턴한다. 

-getSession() == getSession(true) 
-getSession(false) -> 기본에 session이 있으면 가져오고 없으면 null을 리턴한다.

 

 

#session.removeAttribute(); 
-invalidate()와 삭제하는 효과는 같지만 깔끔하게 invalidate() 쓰는 게 낫다. 

 

 

#세션의 유효시간을 설정하는 2가지 방법 
-session.getLastAccessedTime() : 접근시간을 가져온다.
-지정한 유효시간 동안 요청이 없다면 자동 종료된다.

 

1. 첫 번째 방식(web.xml 설정 파일) - 단위(분)

<session-config>
	<session-timeout>30</session-timeout>
</session-config> 

 

2. 두 번째 방식(메서드 방식)- 단위(초)

<% 
    session.setMaxInactiveInterval(60 * 60)  
%>

 

-<session-timeout>의 값을 0이나 음수로 설정하면 유효시간 없이 무제한으로 유지한다.
-단점은 세션 객체가 계속 메모리에 남게 되어 메모리 부족 현상이 발생한다.

★반드시 세션 타임아웃 시간을 지정해주어야 한다.

 

 

#쿠키 vs 세션 차이점

  쿠키 세션
생성위치 클라이언트 서버
보안 약함 강함
공유여부 여러 서버에서 공유가능 여러 서버에서 공유 불가
저장공간 저장할 수 있는 데이터가 제한적이다. 저장할 수 있는 데이터가 제한적이지 않다.

 

 

예제 1)

1. 시작 화면

2. 결과 화면

 

 

1.sessionTest.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>세션 생성</title>
</head>
<body>
	<%
		session.setAttribute("abc", 123);
		session.setAttribute("name", "kim");
		
	%>

	<a href="sessionGet.jsp">세션값 확인</a>
</body>
</html>

 

 

2.sessionGet.jsp

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>세션 확인</title>
</head>
<body>
	<%
		Object obj1 = session.getAttribute("abc");
		Integer intValue = (Integer)obj1;
		out.println("abc : " + intValue);
		
		Object obj2 = session.getAttribute("name");
		String StringValue = (String)obj2;
		out.println("name : " + StringValue);
		
	%>
	<br/>
	<%
		String sName;
		String sValue;
		Enumeration<String> en = session.getAttributeNames();
		
		// 브라우저상에는 아래의 세션에서 설정한 값들은 보이지 않는다.(보안상)
		while(en.hasMoreElements()){
			sName = en.nextElement();
			sValue = session.getAttribute(sName).toString();
			out.println("세션 이름 : " + sName + "<br/>");
			out.println("세션 값 : " + sValue + "<br/>");
		}
		
		out.println("===============================<br/>");
		
		// 세션 아이디
		String sessionID = session.getId();
		out.println("sessionID : " + sessionID + "<br/>");
		
		// 세션 유효시간(초 단위)
		int sessionInterval = session.getMaxInactiveInterval();
		out.println("세션 유효 시간 : " + sessionInterval + "초" + "<br/>");
		
   	 	out.println("===============================<br/>");
   	 	// 세션 특정 데이터 삭제
   	 	session.removeAttribute("abc");
   	 	
		Enumeration<String> en1 = session.getAttributeNames();
		 
		while(en1.hasMoreElements()){
			sName = en1.nextElement();
			sValue = session.getAttribute(sName).toString();
			out.println("세션 이름 : " + sName + "<br/>");
			out.println("세션 값 : " + sValue + "<br/>");
		}
		
		out.println("===============================<br/>");
		// 세션의 모든 데이터 삭제
		session.invalidate();
		
		// 유효한 세션 아이디 존재 여부
		if(request.isRequestedSessionIdValid()){
			out.print("session valid");
		}else{
			out.print("session Invalid");
		}
	%>
</body>
</html>

 

 

 

728x90
반응형

댓글