✔️ 클라이언트와의 연결 정보를 유지하기 위한 정보를 웹 컨테이너(웹 서버)에 저장
이 클라이언트가 뭘 했는가를 담당
서버는 세션을 사용하여 클라이언트 상태를 유지할 수 있다.
➡️ 로그인한 사용자 정보를 유지하기 위한 목적으로 세션 사용
웹 컨테이너는 웹 브라우저마다 한 세션을 생성
➡️ 같은 JSP 페이지라도 웹 브라우저에 따라 서로 다른 세션 사용
세션 Attribute 제공
➡️ 속성값을 저장하거나 읽기 가능
getId()
: String
: 세션의 고유 ID를 구한다. (= 세션 ID & 세션 고유 식별자)
getCreationTime()
: long
: 세션이 생성된 시간 (= 클라이언트가 서버에게 처음 요청을 보낸 시간)
: 첫 번째 요청이라서 바뀌지 않음
: ms (1 / 1000초)
getLastAccessedTime()
: long
: 웹 브라우저가 가장 마지막에 세션에 접근한 시간 (= 마지막에 서버에게 요청을 보낸 시간)
: 마지막 요청이라서 계속 바뀜
: ms (1 / 1000초)
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page session = "true"%> // 이 코드를 주지않아도 기본값이 'true'여서 자동으로 세션을 사용하게 된다.
<%
Date time = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션 정보</title>
</head>
<body>
// 세션 ID 출력
세션ID: <%=session.getCreationTime() %><br>
// 세션 생성시간 출력
세션 생성시간: <%= sdf.format(time) %><br>
<%
time.setTime(session.getLastAccessedTime());
%>
// 세션의 마지막 접근 시간 출력
최근 접근 시간: <%=sdf.format(time) %>
</body>
</html>
🍪 Cookie : 웹 브라우저에 정보 저장
쿠키의 이름이나 데이터는 네트워크를 통해 전달됨
➡️ HTTP 프로토콜을 사용하는 경우 중간에 누군가가 쿠키의 값을 읽어올 수 있음
➡️ 보안 위험성
웹 브라우저가 쿠키를 지원하지 않는 경우 + 강제적으로 쿠키 사용 막음
➡️ 쿠키 사용 불가능
도메인을 이용해서 쿠키를 여러 도메인 주소에 공유 가능
⭐️ session : 웹 서버(컨테이너)에 정보 저장
클라이언트와의 연결정보를 서버에서 관리
➡️ 보안성 높음
쿠키 설정 여부와 상관없이 사용 가능
➡️ URL 재작성 방식을 사용하여 세션 ID를 공유할 수 있게 됨
여러 서버에서 공유 불가능
: 쿠키가 차단됐으므로, 서버에서 주는 sessionId는 계속 바뀌게 된다. 그러면 같은 브라우저인지 서버는 인지하지 못하게된다.
➡️ 요청 URL에다가 sessionID를 붙여줘야 한다. (URL 재작성 방식)
<form action="<c:url value='/login/login'/>"
: url태그가 자동으로 sessionId를 붙여줌(쿠키를 허용하지 않는 브라우저에게)
✔️ <%@ page session = "true"%>
true
만약 브라우저에서 쿠키를 막으면 세션 id를 매핑할 수 없게 된다. 즉, 로그인을 했음에도 불구하고 다음 페이지로 가면 로그아웃이 되어있는 일이 벌어진다.
✔️ session.setAttribute("값 이름", "값")
✔️ session.getAttribute("값 이름")
한번 생성된 세션은 지정한 유효시간 동안 유지
➡️ 웹 어플리케이션을 실행하는 동안 지속적으로 사용해야 하는 데이터를 session의 속성에 저장
웹 브라우저와 일대일로 관련된 값을 저장할 때 세션 사용 (로그인한 회원 정보 등)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
session.setAttribute("ID", "jipark09");
session.setAttribute("NAME", "JTI");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션에 정보 저장</title>
</head>
<body>
세션에 정보를 저장하였습니다. <br>
<%= session.getAttribute("ID") %><br>
<%= session.getAttribute("NAME")%>
</body>
</html>
✔️ session.invalidate()
✔️ session.setMaxInactiveInterval(30 * 60) : 예약 종료(30분 후)
session.invalidate()
를 사용하여 세션을 종료함<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
session.invalidate();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션 종료</title>
</head>
<body>
세션을 종료하였습니다.
</body>
</html>
다음 요청되는 페이지부터 세션이 새로 바뀐다. (session 기본객체 생성)
invalidate()
를 하게 되면 속성 목록이 삭제되므로, 당연히 속성에 접근할 수 없게 된다. 다음 페이지에 새로운 세션이 생기기 때문에 거기서 속성을 접근해야 한다.
➡️ 하지만! 다음 페이지의 생성되는 세션을 해당 페이지에 미리 구할 수도 있다.
<session-config> <session-timeout>30</session-timeout> </session-config>
✔️ 마지막 요청 시간: session.getLastAccessedTime()
✔️ 세션 유효시간 지정 2가지 방법
- WEB-INF\web.xml 파일에
<session-config>
➡️ 분setMaxInaactiveInterval(..)
➡️ 초
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<display-name>05_03</display-name>
<? 30분 시간 설정 ?>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>
<%
session.setMaxInactiveInterval(60 * 60); // 6분
%>
session.invalidate()
를 호출하기 전까지 세션 객체가 서버에 유지됨✔️ request.getSession(): 현재 요청과 관련된 session 객체 리턴
getSession(true)
= getSession()
: session 존재 ⭕️ ➡️ 해당 session을 리턴
: session 존재 ❌ ➡️ 새롭게 session 생성
request.Session(false)
: session 존재 ⭕️ ➡️ 해당 session을 리턴
: session 존재 ❌ ➡️ null
Servlet에 주요 메서드는 service()
인데 그 파라미터는 request랑 response를 받는다. Servlet에서 session 객체를 구해야 될 때가 있는데 파라미터로 받은 request로 session을 구할 수 있다. 또한, 구한 session으로 application을 구할 수 있다.
⭐️ request ➡️ session ➡️ application
✏️
http://localhost8080/chap10/viewCookies.jsp
✏️http://localhost8080/chap10_2/viewCookies.jsp
Reference
: https://velog.io/@ssssujini99/%EC%9B%B9-Session-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D