세션(Session) 이란
네트워크 환경에서 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하기 위한 방법을 의미
세션은 서버 공간에 생성되므로 보안 유지에 유리하지만 데이터를 저장하기 위한 한계성(유저가 많아지면 서버에 부하를 줄 수 있다)에 대한 문제는 존재함
세션은 클라이언트의 요청에 따라 접속된 웹 서버와 가상으로 연결된 상태를 유지하도록 해 줌
세션 서버에 저장해 놓고 공유 또는 전달을 함
세션에 의한 클라이언트 구분
세션은 웹 서버 공간에 생성되는 객체로 웹 브라우저마다 하나씩 존재하며 웹 서버와의 접속을 통해 생성된 세션은 네트워크 환경에서 여러 사용자 중 특정인에 대한 구분자의 역할을 수행
세션을 통해 접속된 웹 브라우저를 닫기 전까지는 웹페이지를 이동하더라도 사용자에 대한 정보가 웹 서버에 객체 상태로 저장되어 있으므로 사용자 정보를 지속적으로 활용할 수 있게 됨.
세션 생성
session 내장 객체
웹 브라우저에서 웹 서버에게 서비스를 요청할 경우 요청한 웹 브라우저에 관한 정보를 저장하고 관리하는 역할을 수행
session 객체는 웹 브라우저당 1개의 세션이 할당되도록 하려면 page 디렉티브의 session 속성이 true로 설정되어 있어야 함.
메서드의 종류
세션 생성하는 setAttribute() 메서드
세션을 생성할 때는 session 내장 객체의 setAttribute() 메서드를 사용하여 다음과 같이 생성
void setAttribute(String name, Object value)
name : 사용할 세션의 이름, value : 세션의 속성 값
예제
txt파일에 저장되어 있는 모든 id pw 들을 검사하여 계정이 존재한다면 사용자의 이름을 출력하는 코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import = "java.io.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션 생성</title>
</head>
<body>
세션 생성하여 ID PW 맞는지 확인하기
<hr>
<%
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pw = request.getParameter("passwd");
BufferedReader reader = null;
try{
String filePath = application.getRealPath("/WEB-INF/account.txt");
reader = new BufferedReader(new FileReader(filePath));
while (true){
String str = reader.readLine();
if(str ==null){
break;
}
String[] result = str.split(" ");
String uid = result[0];
String upw = result[1];
String name = result[2];
if(id.equals(uid) && pw.equals(upw)){
session.setAttribute("memberId" , id);
session.setAttribute("memberPw", pw);
out.println("새로운 세션 생성 성공 ! <br>");
out.println("[ " + name + " ]님이 입장하셨습니다. ");
break;
}
else{
out.println("세션 생성 실패 ! <br>");
out.println("다시 시도해 보세요.<br>");
}
}
}catch (FileNotFoundException fnfe){
out.println("파일이 존재하지 않습니다.");
}catch (IOException ioe){
out.println("파일을 읽을 수 없습니다.");
}finally{
try{
reader.close();
}catch(Exception e){
out.println("reader 닫기 에러발생");
}
}
%>
<p> 아이디 : <%= id %>
<p> 비밀번호 : <%= pw %>
</body>
</html>
세션 정보 확인
1. 단일 세션 정보
getAttribute() 메서드를 사용하여 세션에 저장된 하나의 세션 속성 이름에 대한 속성을 가져오려면 다음과 같이 선언
Object getAtttribute(String name)
getAttribute() 메서드의 반환 유형은 Object 형이므로 반드시 형 변환을 수행한 다음 사용해야 함
괄호 안의 name 매개변수는 세션에 저장된 속성의 이름을 의미하며 name을 선언하지 않게 되면 null의 값을 반환해 줌
getAttribute() 메서드를 사용하여 memberId 세션의 정보를 가져오려면 memberId 값이 String 형인 space 라면 캐스트 연산자를 사용하여 형 변환을 다음과 같이 수행해야 함
String id = (String) session.getAttribute("memberId")
String pw= (String) session.getAttribute("memberPw")
2. 다중 세션 정보
getAttributeNames() 메서드를 사용하여 세션에 저장된 여러 개의 세션 속성 이름에 대한 속성을 가져오려면 다음과 같이 선언
<%@ page import = "java.util.Enumeration"%>
Enumeration en = session.getAttributeNames();
getAttributeNames() 메서드의 반환 유형은 Enumeration 객체 타입이므로 page 디렉티브 태그의 import 속성을 사용하여 java.util.Enumeration을 설정해야 함.
home > 모든 세션 정보 확인하기
<hr>
<%
String name = "";
String value = "";
Enumeration en = session.getAttributeNames();
int count = 0;
while(en.hasMoreElements()){
count++;
name = en.nextElement().toString();
value = session.getAttribute(name).toString();
out.println(count + ".세션의 속성 이름 : ["+ name +"]<br>");
out.println(count + ".세션의 속성값 : ["+ value +"]<br>");
}
%>
세션 유효시간 설정 방법
세션의 유효시간 기본값은 1800초로 설정되어 있으며 변경이 가능함.
session.setMaxInactiveInterval(300); //300초로 유효시간 설정
세션의 유효시간을 0 또는 음수의 값으로 설정하게 될 경우 유효시간이 없는 상태가 된다.
이 경우 세션을 삭제 후에도 웹 서버에는 계속해서 남아있게 되어 메모리 부족 현상이 발생될 수 있으므로 주의가 필요함.
로그인 후 세션 유지 시간
session 내장 객체의 다음 메서드를 변수에 대입하여 선언
단일 세션 삭제
단일 세션 memberID를 삭제할 때 사용하는 session 내장 객체의 메서드로 다음과 같이 선언
session.removeAttribute("memberId")
다중 세션 삭제
session.invalidte()