서버 세션을 사용하면 클라이언트의 상태를 저장할 수 있다.
쿠키와의 차이점
- 세션은 웹 브라우저가 아니라 서버에 값을 저장한다는 점
-> 서버는 세션을 사용해서 클라이언트 상태를 유지할 수 있기 때문에, 로그인한 사용자 정보를 유지하기 위한 목적으로 세션을 사용한다.
1. 세션 사용하기
- 웹 브라우저에 정보를 보관할 때 쿠키를 사용한다면, 세션은 웹 컨테이너에 정보를 보관할 때 사용한다.
- 웹 컨테이너는 기본적으로 한 웹 브라우저마다 한 세션을 생성한다.
1.1. 세션 생성
- page 디렉티브의 session 속성을 'true'로 지정하면 된다.
- 하지만 session 속성의 기본값이 'true'이므로, 'false'로 지정하지 않으면 자동 생성된다.
1.2. 세션 기본 객체
- 세션 기본 객체는 request 기본 객체와 마찬가지로 속성을 제공하므로 setAttribute(), getAttribute() 등의 메서드를 사용하여 속성값을 저장하거나 읽을 수 있다.
- getId() : 세션의 고유 ID를 구한다.(세션ID)
- getCreationTime() : 세션이 생성된 시간을 구한다. 시간은 1970년 1월 1일 이후 흘러간 시간을 의미한다.
- getLastAccessedTime() : 웹 브라우저가 가장 마지막에 세션에 접근한 시간을 구한다.
웹 서버는 세션 ID를 이용해서 웹 브라우저를 위한 세션을 찾기 때문에, 웹 서버와 웹 브라우저는 세션 ID를 공유할 때 쿠키를 사용한다.
1.3. 기본 객체의 속성 사용
- 세션은 지정한 유효 시간 동안 유효한데, 이는 웹 어플리케이션을 실행하는 동안 지속적으로 사용해야 하는 데이터의 저장소로 세션이 적당하다. request 기본 객체가 하나의 요청을 처리할 때 JSP 페이지 사이에서 공유된다면, session 기본 객체는 웹 브라우저의 여러 요청을 처리하는 JSP 페이지 사이에서 공유된다.
-> 따라서, 로그인한 회원 정보 등 웹 브라우저와 일대일로 관련된 값을 저장할 때에는 쿠키 대신 세션을 사용할 수 있다.
- setAttribute() : 세션 속성에 값을 저장한다.
- getAttribute() : 세션 속성 값을 읽어온다.
1.4. 세션 종료
- 세션을 유지할 필요가 없으면 세션을 종료하기위해서 session.invalidate() 메소드를 사용하여 종료한다.
- 세션을 종료하면 현재 사용 중인 session 기본 객체를 삭제하고 session 기본 객체를 삭제하고 session 기본 객체에 저장했던 속성 목록도 함께 삭제한다.
1.5. 세션 유효 시간
- 세션은 최근 접근 시간을 갖는다. session 기본 객체를 사용할 때마다 세션의 최근 접근 시간은 갱신된다.
- getLastAccessedTime() : 최근에 session 기본 객체에 접근한 시간을 나타낸다.
- JSP 페이지가 session 기본 객체를 사용하도록 설정했다면, 웹 브라우저가 JSP 페이지를 실행할 때마다 session 기본 객체에 접근하게 된다.
- 세션 유효 시간은 두가지 방법으로 설정할 수 있다.
(1) WEB-INF/web.xml 파일에 다음과 같이 session-config 태그를 사용하는 방법
<?xml version="1.0" encoding="euc-kr"?>
<web-opp xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<session-config>
<session-timeout>50</session-timeout>
</session-config>
- session-config 태그 값을 세션의 유효 시간으로 사용한다.(단위:분)
- session-config 태그 값이 0이나 음수이면 세션은 유효시간을 갖지 않음( session.invalidate()를 호출할 때까지 세션 객체가 서버에 유지됨)
(2) session 기본 객체가 제공하는 setMaxInactiveInterval() 메서드를 사용하는 방법
<%
session.setMaxInactiveInterval(60 * 60);
%>
- setMaxInactiveInterval 메소드는 초단위로 설정한다.
제거되지 않는 세션 객체로 인해 메모리가 부족해지는 현상을 방지하기 위해선, 반드시 세션 타임아웃 시간을 지정해주어야 한다.
1.6. request.getSession()을 이용한 세션 생성
- HttpSession을 생성하는 다른 방법은 request 기본 객체의 getSession() 메소드를 사용하는 것이다.
- request.getSession() : 현재 요청과 관련된 session 객체를 리턴한다.
- 위 메서드는 session이 존재하면, 해당 session을 리턴하고 존재하지 않으면 새롭게 session을 생성해서 리턴한다.
- getSession(false) : session이 생성되어있을 때만 리턴하게하고, 없으면 null을 리턴한다.
<%@ page session="false" %>
<%
HttpSession httpSession = request.getSession();
List list = (List)httpSession.getAttribute("list");
list.add(productId);
%>
2. 세션을 사용한 로그인 상태 유지
- 세션을 사용해서 로그인을 처리하는 방식은 쿠키를 사용한 방식과 비슷하다.
(1) 로그인에 성공하면 session 기본 객체의 특정 속성에 데이터를 기록한다.
(2) 이후로 session 기본 객체의 특정 속성이 존재하면 로그인한 것으로 간주한다.
(3) 로그아웃할 경우 session.invalidate() 메서드를 호출하여 세션을 종료한다.
2.1. 인증된 사용자 정보 session 기본 객체에 저장하기
- 세션을 사용해서 로그인 상태를 유지하려면 session 기본 객체의 속성에 로그인 성공 정보를 저장하면 된다.
<%@ page contentType="text/html; charset=urf-8" %>
<%
String id = request.getParameter("id");
String password = request.getParameter("password");
if(id.equals(password)) {
session.setAttribute("MEMBERID", id); // session 기본 객체의 MEMBERID 속성을 사용해서 로그인 상태를 저장한다.
%>
<html>
<head><title>로그인성공</title></head>
<body>
로그인에 성공했습니다.
</body>
</html>
<%
} else { // 로그인 실패 시
%>
<script>
alert("로그인에 실패하였습니다.");
history.go(-1);
</script>
<%
}
%>
2.2. 인증 여부 판단
- session 기본 객체에 로그인 상태를 위한 속성의 존재 여부에 따라 로그인 상태를 판단할 수 있다.
<%@ page contentType="text/html; charset=utf-8" %>
<%
String memberld = (String)session.getAttribute("MEMBERID");
boolean login = memberld == null ? false : true;
%>
<html>
<head><title>로그인여부 검사</title></head>
<body>
<%
if (login) {
%>
아이디 "〈%= memberld %〉"로 로그인 한 상태
<%
} else {
%>
로그인하지 않은 상태
%>
</body>
</html>
- 위의 소스는 앞서 본 로그인 소스에서 로그인이 성공하면 해당 페이지가 나올 텐데, session 기본 객체의 "MEMBERID”속성을 사용해서 로그인 여부를 판단하게 된다.
2.3. 로그아웃 처리
- 로그아웃을 처리할 때는 session.invalidate() 메서드를 이용하면 된다.
<%@ page contentType="text/html; charset=utf-8" %>
<%
session.invalidate();
%>
<html>
<head><title>로그아웃</title></head>
<body>
로그아웃하였습니다.
</body>
</html>
3. 연관된 정보 저장을 위한 클래스 작성
- 세션에 여러 정보를 세션에 저장해야한다면, 다음과 같이 세션 속성을 추가하는 방법으로 구현해 볼 수 있다.
<%
String memberld = (String)session.getAttribute("memberId");
String name = (String)session.getAttribute(”ncirne");
%>
- 아니면, 세션 속성을 추가할 때 아래 처럼 클래스도 사용할 수 있다.
public class MemberInfo {
private String id;
private String name;
private String email;
private boolean male;
private int age;
// get 메서드
}
<%
MemberInfo member = new MemberInfo(id, name);
session.setAttribute("memberInfo", memberInfo);
%>