[JSP] 클라이언트와의 대화 2 : session

Jeini·2023년 5월 3일
0

🌐 JSP

목록 보기
22/24
post-thumbnail

💡 session 기본 객체


✔️ 클라이언트와의 연결 정보를 유지하기 위한 정보를 웹 컨테이너(웹 서버)에 저장

  • 이 클라이언트가 뭘 했는가를 담당

  • 서버는 세션을 사용하여 클라이언트 상태를 유지할 수 있다.
    ➡️ 로그인한 사용자 정보를 유지하기 위한 목적으로 세션 사용

  • 웹 컨테이너는 웹 브라우저마다 한 세션을 생성
    ➡️ 같은 JSP 페이지라도 웹 브라우저에 따라 서로 다른 세션 사용

  • 세션 Attribute 제공
    ➡️ 속성값을 저장하거나 읽기 가능

📎 session 기본 객체가 제공하는 세션 정보 관련 메서드

  • getId()
    : String
    : 세션의 고유 ID를 구한다. (= 세션 ID & 세션 고유 식별자)

  • getCreationTime()
    : long
    : 세션이 생성된 시간 (= 클라이언트가 서버에게 처음 요청을 보낸 시간)
    : 첫 번째 요청이라서 바뀌지 않음
    : ms (1 / 1000초)

  • getLastAccessedTime()
    : long
    : 웹 브라우저가 가장 마지막에 세션에 접근한 시간 (= 마지막에 서버에게 요청을 보낸 시간)
    : 마지막 요청이라서 계속 바뀜
    : ms (1 / 1000초)

✏️ session 메서드를 이용하여 현재 사용 중인 세션 정보 확인하기

<%@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를 붙여줌(쿠키를 허용하지 않는 브라우저에게)

💡 session 생성하기


✔️ <%@ page session = "true"%>

  • page 디렉티브의 session 속성은 기본값이 true
  • 웹 브라우저가 처음 접속할 때 세션 생성 ➡️ 이미 생성된 세션을 사용

  1. 클라이언트가 최초로 서버에게 요청을 보낸다.
  2. 각 세션을 구분하기 위해 서버는 브라우저에게 세션마다 쿠키를 통해 고유 ID를 전송한다. ➡️ JSESSIONID
  3. 클라이언트에서 서버로 요청을 할 때 서버는 request header의 쿠키 정보(세션id)를 확인하고, 세션id와 매핑되는 id의 사용자로 인식한다.

만약 브라우저에서 쿠키를 막으면 세션 id를 매핑할 수 없게 된다. 즉, 로그인을 했음에도 불구하고 다음 페이지로 가면 로그아웃이 되어있는 일이 벌어진다.

💡 session 속성 사용

✔️ session.setAttribute("값 이름", "값")
✔️ session.getAttribute("값 이름")

  • 한번 생성된 세션은 지정한 유효시간 동안 유지
    ➡️ 웹 어플리케이션을 실행하는 동안 지속적으로 사용해야 하는 데이터를 session의 속성에 저장

  • 웹 브라우저와 일대일로 관련된 값을 저장할 때 세션 사용 (로그인한 회원 정보 등)

✏️ 회원 아이디와 이름 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 종료


📎 수동 종료

✔️ session.invalidate()
✔️ session.setMaxInactiveInterval(30 * 60) : 예약 종료(30분 후)

  • 세션을 유지할 필요가 없으면 session.invalidate() 를 사용하여 세션을 종료함
    ➡️ session 기본 객체 삭제
    ➡️ session 기본 객체에 저장했던 속성 목록 삭제

✏️ 세션 종료하기

<%@ 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() 를 하게 되면 속성 목록이 삭제되므로, 당연히 속성에 접근할 수 없게 된다. 다음 페이지에 새로운 세션이 생기기 때문에 거기서 속성을 접근해야 한다.
    ➡️ 하지만! 다음 페이지의 생성되는 세션을 해당 페이지에 미리 구할 수도 있다.

📎 자동 종료: web.xml

<session-config>
	<session-timeout>30</session-timeout>
</session-config>

💡 session 유효시간


✔️ 마지막 요청 시간: session.getLastAccessedTime()

  • 세션은 마지막 접근 이후 일정 시간 이내에 다시 세션에 접근하지 않는 경우, 자동으로 세션을 종료한다. (ex. 밥먹고 돌아오면 세션 만료돼서 로그아웃 되어져있음)

⚙️ 30분이 지나면 자동으로 세션을 종료하고, 세션을 다시 요청하면 새로운 세션 생성을 생성

✔️ 세션 유효시간 지정 2가지 방법

  1. WEB-INF\web.xml 파일에 <session-config> ➡️ 분
  2. setMaxInaactiveInterval(..) ➡️ 초

✏️ <session-config> 활용

<?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-timeout>의 값을 0 또는 음수: 유효시간 ❌

✏️ setMaxInactiveInterval(..) 활용

<%
	session.setMaxInactiveInterval(60 * 60); // 6분
%>
  • 명시적으로 session.invalidate() 를 호출하기 전까지 세션 객체가 서버에 유지됨
    ➡️ (유효시간이 없다면) 세션 객체가 계속 메모리에 남게 되어 메모리 부족 현상 발생
    ➡️ 반드시 세션 타임아웃 시간을 지정해주어야 함

💡 request.getSession()을 이용한 세션 생성


✔️ 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

  • 한 브라우저에서 두 URL을 실행해보면, 서로 다른 JSESSIONID 쿠키 값(세션 ID 다름)을 나타낸다.
    ➡️ 두 경로는 서로 다른 웹 어플리케이션이다.
    ➡️ 서로 다른 웹 어플리케이션이 세션을 공유하지 않음을 의미
    ➡️ ⭐️ 같은 웹 브라우저라 하더라도 각자의 어플리케이션에서 사용하는 session 기본 객체는 다르다. (물리적으로는 1개 논리적으로는 2개)

Reference
: https://velog.io/@ssssujini99/%EC%9B%B9-Session-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D

profile
Fill in my own colorful colors🎨

0개의 댓글