JSP - 세션 session

imjingu·2023년 9월 11일
0

개발공부

목록 보기
473/481

세션 session

클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법.
예를 들면 쇼핑몰에서 장바구니와 주문 처리와 같은 회원 전용 페이지의 경우 로그인 인증을 통해서 사용권한을 부여.
다른 웹 페이지에 갔다가 되돌아와도 로그인 상태가 유지되므로 회원 전용 페이지를 사용할 수 있음.
그래서 사용자 인증을 통해 특정 페이지를 사용할 수 있도록 권한 상태를 유지하는 것이 세션.
세션은 웹 서버에서만 접근이 가능하므로 보안 유지에 유리하며 데이터를 저장하는 데 한계가 없음.
세션은 오직 웹 서버에 존재하는 객체로 웹 브라우저마다 하나씩 존재하므로 웹 서버가 웹 서비스를 제공받는 사용자를 구분하는 단위가 됨.
이러한 세션을 사용하면 클라이언트가 웹 서버의 세션에 의해 가상으로 연결된 상태가 됨.
따라서 웹 브라우저를 닫기 전까지 웹 페이지을 이동하더라도 사용자의 정보가 웹 서버에 보관되어 있어 사용자의 정보를 읽지 않음.

다음 화면처럼 세션쿠키 말고는 나오는게 없음 그래서 쿠키보다 보안엔 안전

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Session</title>
</head>
<body>
	<form action="session01_process.jsp" method="post">
		<p> 아이디 : <input type="text" name="id"></p>
		<p> 비밀번호 : <input type="text" name="passwd"></p>
		<input type="submit" value="전송">
	</form>
</body>
</html>

세션 설정하기

1) 전송된 아이디 비번이 일치하면 세션 속성 이름 userID, userPW에 값을 설정하도록 session 내장객체의 setAttribute() 메서드 작성
2) 일치하지 않으면 실패 메시지 출력

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Session</title>
</head>
<body>
	
	 <%
	 	String userId = request.getParameter("id"); // 입력받은 id의 정보를 가져와 userId에 저장
	 	String userPw = request.getParameter("passwd"); // 입력받은 passwd의 정보를 가져와 userPw에 저장
	 	
	 	if(userId.equals("admin") && userPw.equals("1234")) {
	 	// 입력받은 userId와 문자열 admin이 같고 입력받은 userPw와 문자열 1234가 같으면, 로그인 정보가 맞으면
	 		session.setAttribute("userId", userId);
	 		session.setAttribute("userPw", userPw);
	 		out.println("세션 설정이 성공했습니다.<br>");
	 		out.println(userId + "님 환영합니다.");
	 		// 쿠키와는 다르게 response객체에 세션을 담은 과정은 없음 -> 서버에 저장하기 때문
	 	}
	 	else {
	 		out.println("세선 설정이 실패했습니다.");
	 	}
	 %>
</body>
</html>


세션에 저장된 속성 값 가져와 출력하기

1) 세션에 저장된 세션 속성 이름 userId, userPw 의 속성 값을 가져오도록 session 내장 객체의 getAttribute() 메서드를 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Session</title>
</head>
<body>

	<%
		String userId = (String) session.getAttribute("userId"); // 세션에 저장된 값 가져오기
		String userPw = (String) session.getAttribute("userPw");
		
		out.println("설정된 세션의 속성 값 [1] : "  + userId + "<br>");
		out.println("설정된 세션의 속성 값 [2] : "  + userPw);
	%>
</body>
</html>


세션에 저장된 모든 세션 속성 이름과 속성 값 가져와 출력하기

1) 세션에 저장된 모든 세션 속성 이름을 가져오도록 session 내장 객체의 getAttributeNames() 메서드 작성
2) Enumeration 객체의 hasMoreElements() 메서드를 통해 저장된 세션 속성 이름이 있을 때까지 반복하도록 while 문을 작성
3) 세션 속성 이름을 가져오도록 Enumeration 객체의 nextElement() 메서드를 작성
4) 세션 속성 이름의 속성 값을 가져오도록 session 내장 객체의 getAttribute() 메서드를 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Session</title>
</head>
<body>

	<%
		String name;
		String value;
		
		Enumeration en = session.getAttributeNames();
		int i = 0;
		
		while (en.hasMoreElements()) {
			i++;
			name = en.nextElement().toString();
			value = session.getAttribute(name).toString();
			out.println("설정된 세션의 속성 이름 [" + i + "] : " + name + "<br>");
			out.println("설정된 세션의 속성 값 [" + i + "] : " + value + "<br>");
		}
	%>
</body>
</html>


session 삭제

생성된 세션을 더 유지할 필요가 없으면 session 내장
객체의 removeAttribute() 또는 invaildate() 메서드를 사용하여 삭제.

단일 세션 삭제
세션에 저장된 하나의 세션 속성 이름을 삭제하려면
removeAttribute() 메소드를 사용.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Session</title>
</head>
<body>
	<p><h4>-------세션을 삭제하기 전----------</h4>
	<%
		String userId = (String) session.getAttribute("userId");
		String userPw = (String) session.getAttribute("userPw");
		out.println("설정된 세션 userId : " + userId + "<br>");
		out.println("설정된 세션 userPw : " + userPw + "<br>");
		
		session.removeAttribute("userId");
	%>
	
	<p><h4>-------세션을 삭제 한 후----------</h4>
	
	<%
		userId = (String) session.getAttribute("userId");
		userPw = (String) session.getAttribute("userPw");
		out.println("설정된 세션 userId : " + userId + "<br>");
		out.println("설정된 세션 userPw : " + userPw + "<br>");
		
		session.removeAttribute("userId");
	%>
</body>
</html>


다중 세션 삭제하기
세션에 저장된 모든 세션 속성 이름을 삭제하려면 invaildate() 메서드를 사용.
기존의 세션 파일, 키도 삭제되고 재발급.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>session</title>
</head>
<body>
	<%
		String userId = (String) session.getAttribute("userId");
		String userPw = (String) session.getAttribute("userPw");
		
		out.println("설정된 세션 이름 userId : " + userId + "<br>");
		out.println("설정된 세션 값 userPw : " + userPw + "<br>");
		
		// request.isRequestedSessionIdValid() : request에 포함된 SessionId가 유효한지 검사, 반환형은 boolean
		if(request.isRequestedSessionIdValid() == true) {
			out.print("세션이 유효합니다.");
		}
		else {
			out.print("세션이 유효하지 않습니다.");
		}
		
		session.invalidate(); // 세션에 저장된 모든 속성 삭제
	%>
	<p> <h4>--------- 세션을 삭제한 후 -----------</h4>
	<%
		if(request.isRequestedSessionIdValid() == true) {
			out.print("세션이 유효합니다.");
		}
		else {
			out.print("세션이 유효하지 않습니다.");
		}
	%>
</body>
</html>


세션 유효시간 설정하기

세션 유효시간을 가져와 출력하기
1) 세션에 설정된 유효시간을 가져오도록 session 내장 객체의 getMaxInactiveInterval() 메서드를 작성하고 유효시간을 출력하도록 작성
2) 세션 유효시간을 60 * 60 초로 설정하도록 session 내장객체의 setMaxInactiveInterval() 메서드를 작성
3) 세션에 설정된 유효시간을 가져오도록 session 내장객체의 getMaxInactiveInterval() 메서드를 작성하고, 유효시간을 출력하도록 작성

실제 유효시간 변경은 서버에서 하는게 좋음

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>session</title>
</head>
<body>

	<p> <h4>--------- 세션 유효 시간 변경 전-----------</h4>
	<%
		int time = session.getMaxInactiveInterval() / 60;
	
		out.println("세션 유효 시간 : " + time + "분<br>");
	%>
	
	<p> <h4>--------- 세션 유효 시간 변경 후-----------</h4>
	<%
		session.setMaxInactiveInterval(60 * 60);
		time = session.getMaxInactiveInterval() / 60;
	
		out.println("세션 유효 시간 : " + time + "분<br>");
	%>
</body>
</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>session</title>
</head>
<body>
<!-- 
	세션 아이디와 웹 사이트에서 유지한 시간 출력하기
	1) 고유한 세션 내장 객체의 아이디를 가져오도록 session 내장객체의 getId() 메서더를 작성
	2) 세션에 마지막으로 접근한 시간을 가져오도록 session 내장객체의 getLastAccessedTime() 메서드를 작성
	3) 세션이 생성된 시간을 가져오도록 session 내장 객체의 getCreationTime()메서드를 작성
	4) 웹 사이트에 머문 시간을 계산하도록 작성
 -->
	<%
		String sessinId = session.getId();
		// 세션에 마지막으로 접근한 시간
		long lastTime = session.getLastAccessedTime(); // 단위가 1/1.000초
		// 세션이 생성된 시간
		long startTime = session.getCreationTime(); // 단위가 1/1.000초
		
		long usedTime = (lastTime - startTime) / 1000;
		
		out.println("세션 아이디 : " + sessinId + "<br>");
		out.println("요청 시작 시간 : " + startTime + "<br>");
		out.println("요청 마지막 시간 : " + lastTime + "<br>");
		out.println("웹 사이트에서 경과 시간 : " + usedTime + "<br>");
	%>
</body>
</html>

0개의 댓글