웹 페이지들 사이에서 공유하는 정보를 서버에 저장해두고, 웹 페이지들을 매개한다는 점에서 세션도 쿠키와 다르지 않다. 다른 점이라면 쿠키는 클라이언트 PC에 저장되고, 세션은 서버 메모리에 저장된다는 점이다. 쿠키에 비해 보안이 좋기 때문에 로그인처럼 보안을 요구하는 데이터를 다룰 때 세션을 이용한다. 세션은 브라우저 당 하나가 생성된다.
세션의 중요한 특징은 브라우저 당 하나씩 생성된다는 것이다. 브라우저가 서버에 JSESSIONID를 전송하면 서버는 그 값을 이용해서 브라우저를 구분한다.
HttpSessoin
서블릿은 HttpSession클래스를 이용해서 세션을 다룬다. HttpSession객체는 HttpServletRequest의 getSession()를 호출해서 생성한다.
메서드 | 설명 |
---|---|
Object getAttribute(String name) | 지정한 이름을 가진 속성 값을 반환 |
Enumeration getAttributeNames() | 세션 속성 이름들을 Enumeration객체 타입으로 반환 |
long getCreationTime() | 1970년 1월 1일 0시 0초를 기준으로 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000값으로 반환 |
String getId() | 세션에 할당된 고유 식별자를 반환 |
int getMaxInactiveInterval() | 현재 생성된 세션을 유지하기 위해 설정한 세션 유지시간을 int타입으로 변환 |
void invalidate() | 현재 생성된 세션을 소멸 |
boolean isNew() | 최초로 생성한 세션인지 기존에 생성된 세션인지 판별 |
void removeAttribute(String name) | 세션 속성 이름이 name인 속성을 제거 |
void setAttribute(String name, Object value) | 세션 속성 이름이 name인 속성에 속성 값으로 value를 할당한다. |
void setMaxInactiveInterval(int interval) | 세션을 유지하기 위한 세션 유지 시간을 초 단위로 설정 |
@WebServlet("/st")
public class SessionTest extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//HttpSession객체 생성
HttpSession session = request.getSession();
out.println("세션 아이디 :" + session.getId()+"<br>");
out.println("세션 생성 시간 : " + new Date(session.getCreationTime())+"<br>");
out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime())+ "<br>");
//세션의 유효기간을 5초로 한다.
session.setMaxInactiveInterval(5);
out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() +"<br>");
if (session.isNew()) {
out.print("새 세션이 만들어졌습니다.");
}
}
}
유효기간 5초짜리 세션이다.
5초 뒤에 새로고침하면 새로운 세션이 생성된다.
DED7A38FD66953BF141A0EDA6231924C
2E9DB673F46CF57873B7377ED4F42C63
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form name="login" method="post" action="/st2">
아이디 : <input type="text" name="id"><br>
비밀번호:<input type="password" name="password">
<button>확인</button>
</form>
</body>
</html>
@WebServlet(name = "SessionTest", urlPatterns = { "/st2" })
public class SessionTest extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
doHandle(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
doHandle(request, response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//세션 객체 생성
HttpSession session = request.getSession();
//id, pw값을 받아온다.
String id = request.getParameter("id");
String pw = request.getParameter("password");
System.out.println("id : " + id);
System.out.println("pw : " + pw);
if (session.isNew()){ //새 세션이라면,
if(id != null){ //로그인 상태라면,
session.setAttribute("id", id); //세션에 id라는 이름으로 id를 바인딩한다.
out.println("<a href='st2'>로그인 상태 확인</a>"); //다시 st2로 들어온다.
}else {
out.print("<a href='login.html'>다시 로그인 하세요!!</a>"); //로그아웃 상태라면 다시 로그인 창으로 돌려보낸다.
session.invalidate();
}
} else { // 새 세션이 아닐 때 들어온다.
id = (String) session.getAttribute("id"); //세션에 id라고 바인딩된 값을 받아온다.
if (id != null && id.length() != 0) { //해당 id가 있을 경우,
out.print("안녕하세요 " + id + "님!!!");
} else { //없다면 session을 지우고 login창으로 돌려보낸다.
out.print("<a href='login2.html'>다시 로그인 하세요!!</a>");
session.invalidate();
}
}
}
}
로그인을 하면 JSESSIONID가 발급된다.
내부적으로는
if (session.isNew()){ //새 세션이라면,
if(id != null){ //로그인 상태라면,
session.setAttribute("id", id); //세션에 id라는 이름으로 id를 바인딩한다.
out.println("<a href='st2'>로그인 상태 확인</a>"); //다시 st2로 들어온다.
}else {
out.print("<a href='login.html'>다시 로그인 하세요!!</a>"); //로그아웃 상태라면 다시 로그인 창으로 돌려보낸다.
session.invalidate();
}
이 단계다. 새로 생성된 세션이 맞고, 로그인 상태이므로, 세션에 id를 바인딩한다.
그리고 '로그인 상태 확인'을 누르면,
내부적으로는
else { // 새 세션이 아닐 때 들어온다.
id = (String) session.getAttribute("id"); //세션에 id라고 바인딩된 값을 받아온다.
if (id != null && id.length() != 0) { //해당 id가 있을 경우,
out.print("안녕하세요 " + id + "님!!!");
}
이 부분이다. session에 id라는 이름으로 바인딩된 객체를 꺼내서 화면에 출력한다.