JSP | Session
Session
클라이언트에 세션 ID를 부여해서 클라이언트를 구분하는 방법
Session 개요
- 클라이언트와 서버 간 상태를 유지하는 방법 중 하나
- 클라이언트가 처음 접속했을 때 세션 ID를 부여하고 서버에 세션 ID 저장
- 클라이언트가 재접속했을 때 부여된 세션 ID를 이용해서 클라이언트 구분
- 쿠키에 비해 상태 유지가 훨씬 안정적이고 보안상의 문제도 해결
- 세션은 브라우저당 1개가 생성되며 웹 컨테이너에 저장됨
- 세션은 HashMap 컬렉션 형태로 key-value 저장
- 세션의 기본 유지 시간은 30분
- JSP에서는 session 내장 객체 사용
Cookie & Session 비교
쿠키와 세션은 둘 다 클라이언트 상태 유지를 위한 기능을 제공
그러나 다른 점이 많기 때문에 그 차이에 대해 정리
구분 | 쿠키 | 세션 |
---|---|---|
저장 위치 | 클라이언트 | 서버 |
저장 형식 | 텍스트 | Object |
만료 시점 | 쿠키 저장 시 설정 가능 설정하지 않는 경우 브라우저 종료 시 소멸 |
클라이언트가 로그아웃 하거나 설정한 시간 동안 반응이 없을 경우 만료 |
리소스 | 클라이언트 리소스 사용 | 서버 리소스 사용 |
용량 제한 | 한 도메인 당 20개 쿠리 하나당 4KB 총 300개 |
서버가 허용하는 용량 |
Session Method
메소드 | 설명 |
---|---|
void setAttribute(String name, Object value) | 세션의 name 속성에 value 속성값 지정 로그인 아이디를 설정할 때 사용 |
void setMaxInactiveInterval(int interval) | 세션 유지 시간을 초 단위로 설정 |
Object getAttribute(String name) | name 속성의 값을 Object 타입으로 리턴 속성명이 없는 경우 null 리턴 |
Enumeration getAttribute() | 속성의 이름들을 Enumeration 객체 타입으로 리턴 |
long getCreationTime() | 1970년 1월 1일 0시 0초를 기준으로 현재 세션이 생성된 시간까지 경과한 시간을 1/1000초 값으로 리턴 |
String getId() | 세션에 할당된 고유 식별자를 String 타입으로 리턴 브라우저를 구분하기 위해 필요하며 각 세션마다 다른 번호가 부여됨 |
int getMaxInactiveInterval() | 현재 세션에 설정된 유지 시간 반환 |
void invalidate() | 현재 생성된 세션 무효화 |
void removeAttribute(String name) | 속성명이 name인 속성 제거 |
JSP에서 Session 사용
Session 속성 설정
javax.sevlet.http 패키지의 HttpSession 인터페이스를 구현해서 사용
JSP에는 session 내장 객체가 있기 때문에 따로 생성하지 않아도 됨
session.setAttribute(String name, Object value);
- name 속성에 value 속성값 할당
- 세션의 속성값으로는 객체 형태만 올 수 있음
- session 객체는 웹 브라우저와 매핑되므로 해당 웹 브라우저를 닫지 않는 한
같은 창에서 열린 페이지는 모두 같은 session 객체를 공유함
Session 속성을 이용해서 정보 유지
<!-- getAttribute(String name) -->
String name = (String)session.getAttribute("name");
- 속성명에 해당하는 속성값 반환
- getAttribute() 메소드의 리턴 타입이 Object 이기 때문에
저장을 원하는 변수의 자료형으로 형 변환을 해주어야 함
Session 무효화
session.invalidate();
- 세션의 모든 속성이 제거되고 연결이 해제됨
예제
session의 속성을 설정해서 정보를 유지하고
form에 입력한 데이터 출력 후 session 유지를 해제하는 예제
sessionForm.jsp
id와 pwd를 입력받는 JSP 페이지
데이터를 서버에 POST 방식으로 전달하고
sessionTest1.jsp 페이지로 이동
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>id pwd 입력</title>
</head>
<body>
<form method="post" action="sessionTest1.jsp">
id:<input type="text" name="id"><p>
pw:<input type="password" name="pwd"><p>
<input type="submit" value="로그인">
</form>
</body>
</html>
sessionTest1.jsp
session 속성을 설정하고 form에 좋아하는 스포츠와 계절을 입력받는 페이지
입력 데이터를 POST 방식으로 서버에 전달
sesstionTest2.jsp로 페이지 이동
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>파라미터값 처리, 세션 설정</title>
</head>
<body>
<%
// 회원가입을 했다고 가정하고 id와 pwd 값을 전달 받음
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
System.out.println("id: " + id + ", pwd: " + pwd);
// 세션 설정
session.setAttribute("idKey", id);
// 세션 유지 기간 설정, 초 단위
session.setMaxInactiveInterval(60);
%>
<form method="post" action="sessionTest2.jsp">
<h2>가장 좋아하는 스포츠를 선택하세요</h2> <br>
<input type="radio" name="sports" value="농구">농구
<input type="radio" name="sports" value="유도">유도
<input type="radio" name="sports" value="야구">야구
<input type="radio" name="sports" value="이종격투기">이종격투기
<br>
<h2>가장 좋아하는 계절을 선택하세요</h2><br>
<select name="season">
<option value="봄">봄</option>
<option value="여름">여름</option>
<option value="가을">가을</option>
<option value="겨울">겨울</option>
</select>
<input type="submit" value="전송">
</form>
</body>
</html>
sessionTest2.jsp
세션 정보를 유지하며 세션 정보와
sessionTest1.jsp 에 입력한 데이터 출력
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>세션 유지, 세션 정보 출력</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String sports = request.getParameter("sports");
String season = request.getParameter("season");
// 세션 정보 가져오기
// idKey 속성명에 해당하는 속성값 반환
String id = (String) session.getAttribute("idKey");
// 세션 고유 id 반환
String sessionId = session.getId();
// 세션 유지 시간 반환
int interval = session.getMaxInactiveInterval();
// id 값이 있는 경우 출력
if (id != null) {
%>
<b><%=id%></b>님이 좋아하는 스포츠와 계절은?
<br />
<b><%=sports%>와 <%=season%>입니다.</b>
<br />
세션 id:<%=sessionId%>
<br />
세션 유지 시간: <%=interval%>
<%
// 출력 후 세션 연결 해제
session.invalidate();
} else { // id가 null인 경우
out.println("세션 연결 시간 초과. 재로그인 해주세요.");
}
%>
</body>
</html>
결과
HTTP 프로토콜에서 데이터를 유지하는 방법 중 하나인 세션에 대해 살펴보았습니다.
JSP에서는 session 내장 객체를 사용하며 브라우저당 1개의 객체를 공유하게 됩니다.
세션에 속성을 부여해서 클라이언트를 구분할 수 있으며 세션 유지 시간을 설정할 수도 있습니다.
쿠키와 세션이 JSP에서 사용되는 예제를 다루긴 했지만
쿠키와 세션은 다른 프로그래밍 언어에서도 사용되기 때문에
간략하게나마 알아두면 다른 언어에서 쿠키와 세션을 사용하게 될 때도 도움이 될 것입니다.