오봉이와 함께하는 개발 블로그
Servlet - 세션 트래킹(웹 페이지 사이 정보 공유) Session 세션 본문
728x90
쿠키와 세션
- 클라이언트와 서버 간에 정보를 교환하는데 클라이언트 PC 또는 서버의 메모리에 저장해 두고 사용하면 프로그램 속도를 향상시킬 수 있음HTTP 프로토콜
- 서버-클라이언트 통신 시 stateless 방식으로 통신
- 브라우저에서 새 웹페이지를 열면 기존의 웹페이나 서블릿에 관한 어떤 연결 정보도 유지 않음
- 새로 열린 페이지에서 어떤 정보도 알 수 없음
- 페이지가 서로 독립적이어서 서로의 상태를 알 수 없음
- 웹 페이지 사이 또는 서블릿 간 상태나 정보를 공유하려면 웹 페이지를 연결시키는 기능 필요
- 세션 트래킹이라고 함
- 방법
- 세션
- 서버 메모리에 정보를 저장한 후 웹페이지 공유
- 클라이언트와 웹 서버 간에 네트워크로 연결이 지속적으로 유지되고 있는 상태
- 쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단
- 쿠키와 달리 클라이언트 측에 저장되는 것이 아니라 서버 상에 객체로 존재
- 따라서 세션은 서버에서만 접근이 가능하여 보안이 좋음
- 서버에서 사용자의 정보를 유지 관리
- 사용자 인증 후 여러 페이지에 걸쳐 정보를 공유해서 사용할 수 있게 해줌
- Session은 서버 측에서만 설정이 가능
- 브라우저 당 한 개씩 생성
- 세션 생성 및 사용 과정
- 클라이언트가 서버에 페이지 요청
- Session 자동 생성
- Session 속성 설정
- session 내부 객체의 메소드 사용
- 세션 ID
- 클라이언트가 처음 접속하면 서버(컨테이너)로 부터 유일한 ID를 부여 받게 되는데 이를 세션 ID라고 하고 클라이언트가 재 접속했을 때 클라이언트를 구분하기 위한 수단이 된다.
- 서블릿에서 생성된 세션 id는, 브라우저로 전송되어 세션 쿠키에 쿠키 이름 sessionID로 저장됨
- F12 개발자도구 / Application / Cookies에서 확인 가능
- 세션 관련 메소드
- setAttribute(이름, 값) : 세션 이름과 값 설정
- getAttribute(이름) : 이름에 해당된 값 반환
- getAttributeNames() : 모든 세션 이름 반환
- getId() : 세션 ID 반환
- isNew() : 새로 생성되었는지 여부 반환
- getMaxInactiveInterval() : 설정된 유효기간 반환
- removeAttribute() : 설정된 속성값 제거
- invalidate() : 실행 중인 세션 종료. 모든 데이터 삭제. 로그아웃 시 사용
- isRequestedSessionIdValid() : 유효한 세션 ID가 있는 여부 반환
- 세션 값 설정
- session.setAttribute(“SID”, “abcd”)
- session : 내장 객체
- 세션 값 알아오기
- Object obj = session.getAttribute(“SID”);
- Object 타입 반환 (사용 시 형 변환)
- 세션 속성 제거
- session.invalidate()
- 또는 설정된 유효 기간이 만료되면 종료
- 세션 무효화
- invalidate() 메소드를 사용해서 바로 무효화시킬 수 있음
- web.xml 파일에서 session-timeout 설정해서 시간을 정할 수 있음
- setMaxInactiveInterval()를 사용해서 시간 지정 가능
- 기본 세션은 마지막 요청으로부터 30분 경과 후 자동 소멸됨
- 세션 유효 기간을 따로 설정하지 않으면 톰캣에서 설정한 기본 유효 시간 30분이 적용
- 세션
- 방법
- 세션 트래킹이라고 함
세션 방식 예제 1(세션 아이디, 최소 생성 시간, 접근 시간, 유효 시간, isNet() 확인) - SessionTest.java
@WebServlet("/sess")
public class SessionTest extends HttpServlet {
private static final long serialVersionUID = 1L;
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.println("세션 아이디 : " + session.getId() + "<br>");
out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
if(session.isNew()) {
out.print("새 세션이 만들어졌습니다");
}
}
}
세션 방식 예제 2(세션 유효 시간 5초로 설정) - SessionTest2.java
@WebServlet("/sess2")
public class SessionTest2 extends HttpServlet {
private static final long serialVersionUID = 1L;
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.println("세션 아이디 : " + session.getId() + "<br>");
out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
out.println("기본 세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
session.setMaxInactiveInterval(5); // 세션 유효 시간을 5초로 설정
out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
if(session.isNew()) {
out.print("새 세션이 만들어졌습니다");
}
}
}
세션 방식 예제 3(invalidate() 호출해서 사용자가 세션을 강제로 삭제) - SessionTest3.java
@WebServlet("/sess3")
public class SessionTest3 extends HttpServlet {
private static final long serialVersionUID = 1L;
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.println("세션 아이디 : " + session.getId() + "<br>");
out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
if(session.isNew()) {
out.print("새 세션이 만들어졌습니다");
}
session.invalidate();// 생성된 세션 객체를 강제로 삭제
}
}
세션 이용해서 로그인/로그아웃 기능 - sessionLogin.html, LoginLogout.java, SessionLogout.java
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
<form name="frmLogin" method="post" action="logInOut" >
아이디 :<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>
@WebServlet("/logInOut")
public class LoginLogout extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
// 처음 접속이면
if(session.isNew()) {
// user_id 입력 값이 있으면
if(user_id != null) {
// SID 이름, user_id 값으로 세션 변수 설정
session.setAttribute("SID", user_id);
// 다시 실행시켜서 SID 확인
out.print("<a href='logInOut'>로그인 상태 확인</a>");
}else { // user_id 입력 값이 없으면
out.print("<a href='sessionLogin.html'>다시 로그인 하세요!</a>");
session.invalidate();
}
} else { //아니고 세션이 있으면
user_id = (String) session.getAttribute("SID");
if(user_id != null && user_id.length() != 0) {
out.print("안녕하세요 " + user_id + "님!!");
out.print("<br><a href='logout'>로그아웃</a>");
} else {
out.print("<a href='sessionLogin.html'>다시 로그인 하세요!</a>");
session.invalidate();
}
}
}
}
@WebServlet("/logout")
public class SessionLogout extends HttpServlet {
private static final long serialVersionUID = 1L;
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();
session.invalidate(); // 세션 무효화
out.print("로그아웃 되었습니다. <br>");
out.print("<a href='sessionLogin.html'>로그인</a>");
}
}
728x90
'BE > Servlet' 카테고리의 다른 글
스프링 MVC 1 - 멀티 쓰레드 (0) | 2022.08.09 |
---|---|
스프링 MVC 1 - 서블릿 (0) | 2022.08.08 |
Servlet - 세션 트래킹(웹 페이지 사이 정보 공유) Cookie 쿠키 (0) | 2021.12.29 |
Servlet - 세션 트래킹(웹 페이지 사이 정보 공유)URL Rewrite (0) | 2021.12.29 |
Servlet - 세션 트래킹(웹 페이지 사이 정보 공유)<hidden> 태그 사용 (0) | 2021.12.29 |
Comments