티스토리 뷰
세션(Session)
- 세션 역시 웹 페이지들 사이의 공유 정보를 서버에 저장해 두고웹 페이지들을 매개해 주는 방법이라는 점에서 쿠키와
같다.
- 쿠키는 사용 시 웹 페이지들의 정보가 클라이언트 PC에 저장되므로 정보가 쉽게 노출될 수 있는 반면, 세션은 서버의
메모리에 생성되어 정보를 저장한다. 따라서 웹 페이지에서 사용되는 정보 중에 로그인 정보처럼 보안이 요구되는 정보는 대부분 세션을 이용한다.
- 세션은 각 브라우저당 한 개, 즉 사용자당 한 개가 생성된다.
세션의 특징
- 정보가 서버의 메모리에 저장된다.
- 브라우저의 세션 연동은 세션 쿠키를 이용한다.
- 쿠키보다 보안에 유리하다.
- 서버에 부하를 줄 수 있다.
- 브라우저(사용자)당 한 개의 세션(세션 id)이 생성된다.
- 세션은 유효 시간을 가진다.( 기본 유효 시간은 30분)
- 로그인 상태 유지 기능이나 쇼핑몰의 장바구니 담기 기능 등에 주로 사용된다.
세션 기능 실행과정
- 클라이언트의 브라우저가 서버에 최초 접속하면 서버의 서블릿은 세션 객체를 생성한 후 세션 객체에 대한
세션 id를 브라우저에 전송한다.
- 브라우저는 이 세션 id를 브라우저가 사용하는 세션 쿠키에 저장한다.
- 즉, 서버로부터 전송된 세션 id도 쿠키이며, 쿠키 이름은 jsessionId 이다.
세션 API
- 서블릿에서 세션을 이용하려면 HttpSession 클래스 객체를 생성해서 사용해야 한다.
- HttpSession 객체는 HttpServletRequest의 getSession() 메서드를 호출해서 생성한다.
- 세션을 얻는 getSession() 메서드로는 다음과 같은 것들이 있다.
- getSession() : 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성한다.
- getSession(true) : 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성한다.
- getSession(false) : 기존의 세션 객체가 존재하면 반환하고, 없으면 null을 반환한다.
HttpSession 클래스의 여러 가지 메서드
메서드 | 반환 타입 | 설명 |
getAttribute(String name) | Object | 속성 이름이 name인 속성 값을 Object 타입으로 반환한다. 해당되는 속성 이름이 없을 경우 null을 반환한다. |
getAttributeNames() | Enumeration | 세션 속성 이름들을 Enumeration 객체 타입으로 반환한다. |
getCreationTime() | long | 1970년 1월 1일 0시 0초를 기준으로 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000초 값으로 반환 |
getId() | String | 세션에 할당된 고유 식별자를 String 타입으로 반환한다. |
getMaxInactiveInterval() | int | 현재 생성된 세션을 유지하기 위해 설정된 세션 유지 시간을 int 타입으로 반환한다. |
invalidate() | void | 현재 생성된 세션을 소멸한다. |
isNew() | boolean | 최초로 생성된 세션인지 기존에 생성되어 있었던 세션인지 판별한다. |
removeAttribute (String name) |
void | 세션 속성 이름이 name인 속성을 제거한다. |
setAttribute(String name, Object value) |
void | 세션 속성 이름이 name인 속성에 속성 값으로 value를 할당한다. |
setMaxInactiveInterval(int interval) | void | 세션을 유지하기 위한 세션 유지 시간을 초 단위로 설정한다. |
- Session 메서드은 어떻게 사용하는지 확인해 보자.
* SessionTest.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class SessionTest
*/
@WebServlet("/sess")
public class SessionTest extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// getSession()을 호출하여 최초 요청 시 세션객체를 새로 생성하거나 기존 세션을 반환한다.
HttpSession session = request.getSession();
// 생성된 세션 객체의 id를 가져온다.
out.print("세션 아이디 : " + session.getId() + "<br>");
// 최초 세션 객체생성 시간을 가져온다.
out.print("최초 세션 생성 시각 : " + new Date(session.getCreationTime())+ "<br>");
// 세션 객체에가장 최근에 접근한 시간을 가져온다.
out.print("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
// 세션 객체의 유효시간을 가져온다.
out.print("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
// 최초 생성된 세션인지 판별한다.
if(session.isNew()) {
out.print("새 세션이 만들어졌습니다.");
}
}
}
- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/sess를 입력한다.
- 접속 후 새로고침을 해보자.
- 생성된 세션도 확인할 수 있다.
세션 유효 시간
- 세션 기본 유효 시간은 톰캣 컨테이너에서 지정한 1800초(30분) 이다. 그러나 HttpSession의 setMaxInativeInterval()
메서드를 이용하면 사용자가 원하는 세션 유효 시간을 설정할 수 있다.
- invalidate() 메서드를 이용하면 세션을 언제든지 삭제할 수도 있다.
* SessionTest.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class SessionTest
*/
@WebServlet("/sess")
public class SessionTest extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
out.print("세션 아이디 : " + session.getId() + "<br>");
out.print("최초 세션 생성 시각 : " + new Date(session.getCreationTime())+ "<br>");
out.print("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
// 기본 세션 유효 시간을 출력한다.
out.print("기본 세션 유효 시간 : " + session.getMaxInactiveInterval()+ "<br>");
// 세션 유효 시간을 10초로 설정한다.
session.setMaxInactiveInterval(10);
// 변경된 세션 유효 시간을 출력한다.
out.print("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
if(session.isNew()) {
out.print("세션이 새로 만들어졌습니다.");
}
}
}
- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/sess를 입력한다.
- 접속 후 새로고침을 해보자.
- 세션 유효 시간을 재설정하는 경우는 주로 은행 사이트에 자주 발생한다.
세션 삭제
- 세션을 삭제한다.
- 세션은 session.invalidate() 메서드로 삭제한다.
* SessionTest.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class SessionTest
*/
@WebServlet("/sess")
public class SessionTest extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
out.print("세션 ID : " + session.getId() + "<br>");
out.print("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
out.print("최근 세션 접속 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
out.print("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
if(session.isNew()) {
out.print("새 세션이 만들어졌습니다.");
}
// 생성된 세션 객체를강제로 삭제한다.
session.invalidate();
}
}
- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/sess를 입력한다.
- 접속 후 새로고침을 해보자.
- 접속 시 매번 새로운 세션이 생성된다.
세션 로그인 정보 바인딩
- 로그인 상태처럼 사용자와 관련된 정보를 바인딩해서 사용할 때 세션을 이용하는 것이 편리하다. 세션은 사용자당 한 개씩 생성되기 때문이다.
- HttpSession의 바인딩 기능을 알아본다.
- 먼저 로그인 폼을 생성한다.
* login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
<form name="frmLogin" method="post" action="login" encType="UTF-8">
아이디 : <input type="text" name="user_id"><br>
비밀번호 : <input type="password" name="user_pw"><br>
<input type="submit" value="로그인" />
<input type="reset" value="다시 입력" />
</form>
</body>
</html>
* SessionTest.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class SessionTest
*/
@WebServlet("/login")
public class SessionTest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
public void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
// 로그인 창에서 전송된 ID와 비밀번호를 가져온다.
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
// 최초 요청 시 수행
if(session.isNew()) {
// 로그인창에서 서블릿으로 요청했다면 ID가 null이 아니므로 세션에 ID를 바인딩한다.
if(user_id != null ) {
session.setAttribute("user_id",user_id);
out.print("<a href='login'>로그인 상태 확인</a>");
}else {
out.print("<a href='login2.html'>다시 로그인하세요!</a>");
session.invalidate();
}
}else { // 재요청 시 세션에서 ID를 가져와 이전에 로그인했는지 여부를 확인.
user_id = (String) session.getAttribute("user_id");
if(user_id != null && user_id.length() != 0) {
out.print("안녕하세요 " + user_id + "님!");
}else {
out.print("<a href='login2.html'>다시 로그인하세요!</a>");
session.invalidate();
}
}
}
}
- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/login.html을 입력한다.
- 아이디를 입력하고 [로그인] 버튼을 눌러 확인한다.
- "로그인 상태 확인" 링크를 클릭하여 바인딩 상태를 확인한다.
- 아이디를 입력하지 않고 /login 페이지에 직접 접근하는 경우 다음과 같은 페이지가 나타난다.
'Servlet' 카테고리의 다른 글
encodeURL() (0) | 2024.08.13 |
---|---|
서블릿 - 세션 로그인 예제 (0) | 2024.08.12 |
세션 트래킹 - 쿠키 (0) | 2024.08.12 |
세션 트래킹 (0) | 2024.08.12 |
서블릿 컨텍스트(ServletContext) (0) | 2024.08.12 |
- Total
- Today
- Yesterday
- 내장객체
- CSS
- react
- FMT
- 스프링
- javaserverpage
- 리액트
- 제이쿼리
- html css
- httpServletRequest
- el
- Java Server Page
- Redux
- Binding
- Network
- HTML
- 네트워크
- nodejs
- 미들웨어
- 서브넷팅
- script element
- 세션
- a 태그
- JSP
- Cookie
- Session
- 서블릿
- Servlet
- CSS 속성
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |