JSESSIONID
아직 세션을 배우지는 않았지만 쿠키의 정보 중 JSESSIONID 에 대해서 의문을 가질 분들이 있을 것입니다. 세션 기술에서는 웹 브라우저로 세션ID를 보낼 때 쿠키 형태로 만들어서 전송하는데, JSESSIONID 가 바로 세션 정보를 저장한 쿠키 이름입니다.
세션(session)
쿠키를 설명할 때 (다른 페이지로 이동하더라도 그 전 페이지의 정보가 유지되어야 하는) 상태 유지를 위한 특별한 기법이 필요하다는 설명을 하였습니다. 상태 유지의 한 방법인 쿠키는 클라이언트의 컴퓨터에 정보를 저장하여 하드웨어에 저장해 두었던 정보를 가져와 페이지가 이동되더라도 상태가 유지되도록 합니다. 하지만 이 방법은 쿠키가 저장되는 디렉토리만 뒤지면 얼마든지 정보를 알아낼 수 있으므로 PC 방과 같이 여러 사람이 PC를 공유하는 경우에는 개인 정보가 유출될 수 있다는 우려가 있어 보안 유지가 되지 않는다는 단점이 있습니다. 또한 저장할 수 있는 데이터도 1.2MB로 한계가 있습니다.
이러한 단점을 극복하기 위해서 나온 상태 유지 방법 중의 하나가 세션입니다. 세션은 다음과 같은 장점이 있습니다.
- JSP(서버)에서만 접근 가능하므로 보안 유지에 강력 합니다.
- 저장할 수 있는 데이터에 한계가 없습니다.
세션은 서버 상에 존재하는 객체로서 브라우저 단위당 한 개씩 존재하게 됩니다. 세션은 웹 브라우저를 닫기 전까지 페이지를 이동하더라도 사용자의 정보를 잃지 않고 서버에 보관할 수 있도록 하는 객체입니다.
이러한 세션이 활용되는 대표적인 예는 로그인 페이지입니다. 회원 전용 페이지의 경우 로그인 과정을 통해 페이지를 사용할 수 있는 권한을 설정해야 합니다. 이러한 권한 설정을 할 때 세션이 사용됩니다.
세션에 의해서 로그인 인증 처리를 하면 해당 페이지를 사용할 수 있는 권한에 대한 상태가 유지되기 때문에 다른 페이지로 갔다가 돌아오더라도 다시 로그인을 하지 않고 바로 회원 전용 페이지를 사용할 수 있게 됩니다.
HTTP 프로토콜은 비 상태 프로토콜이기에 기본적으로 이전의 정보를 저장하고 있지 못하는 데도 불구하고 다른 페이지로 이동했다 다시 이전 페이지로 돌아오더라도 로그인한 상태가 유지됩니다. 이는 내부적으로 세션을 활용하여 로그인 과정에서 해당 페이지를 사용할 수 있는 권한을 부여해 두었기 때문입니다.
앞서도 언급했지만 이러한 세션은 웹 브라우저 당 하나씩만 발급됩니다. 이를 증명하기 위해서 웹 브라우저를 하나 더 새롭게 띄어 봅시다. 새롭게 띄운 웹 브라우저에는 해당 페이지를 사용할 수 있는 권한이 없음을 알 수 있습니다. 그러므로 새롭게 띄운 웹 브라우저에서 다시 로그인을 해야만 해당 사이트를 사용할 수 있는 권한을 부여 받을 수 있게 됩니다.
세션 사용하기
JSP 는 세션의 상태 관리를 위한 내장 객체 session을 제공합니다. 다음은 session에서 자주 사용되는 메소드를 정리한 표입니다.
메소드 | 설명 |
Object getAttribute(String name) | 이름에 해당되는 객체 값을 가져온다. 없을 경우에는 null을 반환한다. 반환값은 Object 형이므로 반드시 형 변환을 하여 사용해야 한다. |
Enumeration getAttributeNames() | 세션에서 모든 객체의 이름을 Enumeration 형으로 얻어 준다. |
long getCreationTime() | 세션이 만들어진 시간을 반환한다. |
String getId() | 해당 세션을 가리키는 고유 id 값을 String 형으로 변환한다. |
long getLastAccessedTime() | 해당 세션이 클라이언트가 마지막으로 request를 보낸 시간을 long 형으로 반환한다. |
int getMaxInactiveInterval() | 사용자가 다음 요청을 보낼 때까지 세션을 쥬지하는 최대 시간(초 단위) 을 반환한다. |
boolean isNew() | 해당 세션이 처음 생성되었으면 true 값을 반환하고 이전에 생성된 세션이라면 false 를 반환한다. |
void removeAttrubute(String name) | 지정된 이름에 해당하는 객체를 세션에서 제거한다. |
void setAttribute(String name, Object value) | 세션에 지정된 이름에 객체를 추가한다. |
void setMaxInactiveInterval(int iterval) | 사용자가 다음 요청을 보낼 때까지 세션을 유지하는 최대 시간(초 단위)을 설정한다. 이 시간을 넘기면 서블릿 컨테이너는 세션을 종료한다. |
void invalidate() | 해당 세션을 없애고 세션에 속해있는 값들을 없앤다. |
상태유지를 위해서는 세션에 값을 저장한 후 이를 가져와서 사용합니다. 이를 위해서는 세션에 값을 저장하는 setAttribute() 와 세션에 저장된 값을
얻기 위한 getAttribute() 가 사용됩니다.
다음은 setAttribuet() 의 기본 형식입니다.
session.setAttribuet(String name, Object value);
setAttribute() 로 세션에 값을 지정할 때 원하는 값을 찾아오기 위해서 이름을 지정해 주어야 하는데, setAtribuet() 의 기본 형식에서 볼 수 있듯이 저장한 값을 식별하기 위한 이름은 String 형이어야 합니다. 세션에 저장하는 값은 Object 형이므로 어떠한 자료 형태라도 저장할 수 있습니다.
다음은 세션에 "PinkSung" 이란 문자열 값을 "ID" 이란 이름으로 저장하는 예입니다.
session.setAttribute("id", "pinksung");
이제 세션에 값을 저장하는 예제를 만들어 봅시다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
session.setAttribute("id", "pinksung");
session.setAttribute("pwd", "test1234");
session.setAttribute("age", 20);
%>
<h3> 세션 설정</h3>
<a href="05_getSession.jsp" >가기</a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>세션 값 얻어오기</h3>
<%
String id =(String) session.getAttribute("id");
String pwd =(String)session.getAttribute("pwd");
Integer age =(Integer)session.getAttribute("age");
%>
id : <%= id %> <br>
pwd : <%= pwd %> <br>
age : <%= age %> <br>
</body>
</html>
세션 값 얻어오기
id : pinksung
pwd : test1234
age : 20
댓글 ( 4)
댓글 남기기