티스토리 뷰

정리 노트/JSP

11주차-1일

eyoadgkn 2023. 12. 18. 12:30

세션

세션

세션은 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법을 말하는데, 사용자 인증을 통해서 특정 페이지를 사용할 수 있도록 권한 상태를 유지하는 것이 세션입니다.

세션은 웹 서버에서만 접근이 가능하므로 보안 유지에 유리하고, 데이터를 저장하는 데 한계가 없다는 장점이 있습니다.
또한, 세션은 오직 웹 서버에 존재하는 객체로 웹 브라우저마다 하나씩 존재하므로 웹 서버의 서비스를 제공받는 사용자를 구분하는 단위가 됩니다. 이런 세션을 사용하면 클라이언트가 웹 서버의 세션에 의해서 가상으로 연결된 상태가 됩니다. 따라서 웹 브라우저를 닫기 전까지 웹 페이지를 이동하더라도 사용자의 정보가 웹 서버에 본관되어 있어 사용자 정보를 잃지 않습니다.

이런 session은 내장 객체를 제공을 합니다

메서드 반환유형 설명
getAttribute(String name) java.lang.Object 세션 속성 이름이 name인 속성 값을 Object 형으로 반환합니다. 해당되는 속성 이름이 없을 때는 null을 반환합니다. 반환 값이 Object형이므로 반드시 형변환을 하여 사용을 해야합니다.
getAttributeNames() java.Util.Enumeration 세션 속성 이름을 Enumeration 객체 타입으로 반환합니다.
getCreationTime() long 세션이 생성된 시간을 반환합니다.
1970년 1월 1일 0시 0초부터 현재 세션이 생성된 시간까지 경과한 시간을 ms으로 반환을 합니다.
getId() java.lang.string 세션에 할당된 고유 아이디를 String 형으로 반환합니다.
getLastAccessedTime() long 해당 세션에 클라이언트가 마지막으로 request를 보낸 시간을 반환합니다.
getMaxInactiveInterval(int interval) int 해당 세션을 유디하기 위해 세션 유지 시간을 반환합니다. 기본값으로는 1,800초(30분)입니다.
isNew() boolean 해당 세션의 생성여부를 반환합니다. 처음 생성된 세션이면 true를 반환하고 이전에 생성이 되었던 session이라면 false를 반환합니다.
removeAttribute(String name) void 세션 속성 이름이 name인 속성을 제거를 합니다.
setAttribute(String name, Object value) void 세션 속성 이름이 name인 속성에 value를 할당합니다.
setMaxInactiveInterval(int Interval) void 해당 세션을 유지하기 위한 세션 유지 시간을 초 단위로 설정을 합니다.
Invalidate()   현재 세셩에 저장된 모든 세션 소성을 제거합니다.
세션 생성

세션을 사용할려면 먼저 세션을 생성을 해주어야 합니다. 세션 생성은 session 내장 객체의 setAttribute() 메서드를 사용합니다. setAttribute() 메서드를 이용해 세션의 속성을 설정하면 계속 세션 상태를 유지할 수 있습니다. 만약 동일한 세션의 속성 이름으로 세션을 생성하면 마지막에 설정한 것이 세션 속성 값이 됩니다.

void setAttribute(String name, Object value);
//첫 번째 매개변수 name은 세션으로 사용할 세션 속성 이름을 나타내며, 세션에 저장된 특정 값을 찾아오기 위한 키로 사용이 됩니다. 두번째 매개변수 value 는 세션의 속성 값을 나타탭니다. 세션 속성 값은 Object 객체 타입만 가능하기 때문에 int, double, char 등의 기본 타입은 사용을 할 수가 없습니다.
ex) session.setAttribute("memberId", "admin");

session01.jsp

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

session01_process.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String user_id = request.getParameter("userid");
		String user_pw = request.getParameter("userpw");
		
		if(user_id.equals("admin") && user_pw.equals("1234"))
		{
			/* session 안에 setAttribute를 통해 키와 값을 지정합니다.  */
			session.setAttribute("userID", user_id);
			session.setAttribute("userPW", user_pw);
			
			out.println("세션 설정이 성공했습니다.<br>");
			out.println(user_id+"님 환영합니다.");
		}
		else
		{
			out.println("세션 설정이 실패했습니다.");
		}
	%>
</body>
</html>

세션 정보

생성된 세션의 정보를 얻어올려면 session 내장 객체의 getAttribute() 또는 getAttributeNames() 메서드를 사용하여 정보를 가져옵니다. 

단일 세션 정보 얻기

세션에 저장된 하나의 세션 속성 이름에 대한 속성 값을 얻어오려면 getAttribute() 메서드를 사용합니다. 이 메서드는 반환 유형이 Object이기 때문에 반드시 형 변환을 해서 사용해야 합니다.

Object getAttribute(String name);
ex) String id = (String) session.getAttribute("memberId");

session02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		/* session.getAttribute를 통해 입력한 저장된 값을 가져옵니다. 캐스팅 필요. */
		String user_id = (String)session.getAttribute("userID");
		String user_pw =(String) session.getAttribute("userPW");
		
		out.println("설정된 세션의 속성 값[1]  : "+ user_id+"<br>");
		out.println("설정된 세션의 속성 값[2]  : "+ user_pw);
	%>
</body>
</html>

 

다중 세션 정보 얻기

여러개 한번에 데이터들을 받아서 처리를 하려면 getAttributeNames()메서드를 사용합니다. 해당 메서드는 반환유형이 Enumeration 객체 타입이기 때문에 모든 세션 정보를 얻어오는 데 유용합니다 .

Enumeration getAttributeNames();
ex)
Enumeration en = session.getAttributeNames();

while(en.hasMoreElements())
{
   String name = en.nextElement().toString();
   String value = session.getAttribute(name).toString();
}

session03.jsp

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String name;
		String value;
// 		 getAttributeNames를 통해 en에 Enumeration 타입으로 할당. 
		Enumeration en = session.getAttributeNames();
// 		반복 숫자표시를 보기위해 정수형 변수 초기화
		int i = 0;
		/* Enumeration 사용으로 while문 필수 */
		while(en.hasMoreElements())
		{
			i++;
// 			toString() = 문자열로 변경.
// 			nextElement() = 다음의 값을 반환
// 			반환받은 key의 값을 넣기 위해 getAttribute(name) 사용 
			name=en.nextElement().toString();
			value = session.getAttribute(name).toString();
			
			out.println("설정된 세션의 속성 이름 [ " +i +"] : " + name + "<br>");
			out.println("설정된 세션의 속성 값 [ " +i +"] : " + value + "<br>");
		}
	%>
</body>
</html>

세션 삭제

생성된 세션을 더 유지할 필요가 없다면 session 내장객체의 removeAttribute() or invalidate() 메서드를 이용해 삭제합니다. 세션이 삭제되면 현재 사용 중인 session 내장 객체가 삭제되므로 session 내장 객체에 저장된 모든 속성도 함께 삭제가 됩니다.

단일 세션 삭제하기

세션에 저장된 하나의 세션 속성이름을 삭제하려면 removeAttribute() 메서드를 사용합니다.

void removeAttribute(String name)
ex) session.removeAttribute("memberId");

session04.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h4>ㅡㅡ세션을 삭세하기 전ㅡㅡ</h4>
	<%
// 	getAttribute를 통해 key가 userID,userPW이고, 안에 값을 각각 할당.
		String user_id = (String) session.getAttribute("userID");
		String user_pw = (String) session.getAttribute("userPW");
		
		out.println("설정된 세션 이름 userID :  " + user_id + "<br>");
		out.println("설정된 세션 값 userPW :  " + user_pw + "<br>");
		
// 		removeAttribute를 통해 해당 key를 삭제
		session.removeAttribute("userID");
	%>
	<h4>ㅡㅡ세션을 삭세한 후ㅡㅡ</h4>
		
	<%
// 	String캐스팅 하면서 세션에 저장된 ID,PW를 가져와서 변수에 저장
		user_id = (String) session.getAttribute("userID");
		 user_pw = (String) session.getAttribute("userPW");
		
// 		 removeAttribute를 사용해 id를 삭제한 값이 null로 변경
		out.println("설정된 세션 이름 userID :  " + user_id + "<br>");
		out.println("설정된 세션 값 userPW :  " + user_pw + "<br>");
	%>
</body>
</html>

session05.jsp

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h4>ㅡㅡ세션을 삭세하기 전ㅡㅡ</h4>
	
	<%
		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>");
		}
// 		removeAttribute를 통해 해당 값들 삭제
		session.removeAttribute("userID");
	%>
	<h4>ㅡㅡ세션을 삭세한 후ㅡㅡ</h4>
	
	<%
// 		값이 삭제되었는지 확인
		en = session.getAttributeNames();
	
		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>

다중 세션 삭제하기

세션에 저장된 모든 세션 속성 이름을 삭제할려면 invalidate() 메서드를 사용합니다.

void invalidate()
ex) session.invalidate();

session06.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h4>ㅡㅡ세션을 삭세하기 전ㅡㅡ</h4>
	
	<%
		String user_id = (String) session.getAttribute("userID");
		String user_pw = (String) session.getAttribute("userPW");
	
		out.println("설정된 세션 이름 userID : " + user_id + "<br>");
		out.println("설정된 세션 값 userPW : " + user_pw + "<br>");
		
		
		if(request.isRequestedSessionIdValid() == true)
		{
			out.print("세션이 유효합니다.");
		}
		else
		{
			out.println("세션이 유효하지 않습니다.");
		}
		
// 		세션에 저장된 값들을 제거/삭제
		session.invalidate();
	%>
	<h4>ㅡㅡ세션을 삭세한 후ㅡㅡ</h4>
	<%
	
		if(request.isRequestedSessionIdValid() == true) 
		{
			out.print("세션이 유효합니다.");
		}
		else
		{
			out.println("세션이 유효하지 않습니다.");
		}
	%>
</body>
</html>

세션 유효 시간 설정

세션 유효시간은 세션을 유지하기 위한 세션의 일정 시간을 말합니다. 웹 브라우저에 마지막 접근한 시간부터 일정 시간 이내에 다시 웹 브라우저에 접근하지 않으면 자동으로 세션이 종료됩니다. 이러한 세션 유효 시간을 설정하기 위해서 session 내장객체의 setMaxInactiveInterval() 메서드를 사용합니다.

void setMaxInactiveInterval(int interval)
여기서  매개변수 interval은 세션의 유효 시간입니다. 따로 작성을 하지 않을 경우 기본 값이 1,800초(30분) 이고, 초단위로 설정합니다.

*만약 세션 유효 시간을 0이나 음수로 설정하면 세션 유효 시간이 없는 상태가 됩니다. 이 경우에는 세션을 삭제했을 때 session.invalidate() 메서드를 호출하지 않는다면 생성된 세션 속성이 웹 서버에서 제거되지 않고 유지가 됩니다. 따라서 세션 유효 시간이 없는 상태에서 session.invalidate() 메서드를 명시적으로 실행하지 않으면 한 번 생성된 세션이 계속 메모리에 남아 있고, 시간이 흐르면 이 세션 때문에 메모리 부족 현상이 발생하게 됩니다.
*세션 유효시간을 360초로 설정하는 예
ex)session.setMaxInactiveInterval(60*60); 

session07.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h4>ㅡㅡㅡ세션 유효 시간 변경 전ㅡㅡㅡ</h4>
	<%
// 	따로 지정을 하지 않는다면 getMacInactiveInterval()의 기본 값은 1800초입니다.
		int time = session.getMaxInactiveInterval() / 60;
		out.println("세션 유효 시간 : " + time + "분 <br>");
	%>
	<h4>ㅡㅡㅡ세션 유효 시간 변경 후ㅡㅡㅡ</h4>
	<%
// 	따로 시간을 지정. 메서드 안의 값은 기본적으로 '분'을 가르킴
		session.setMaxInactiveInterval(60*60);
		time = session.getMaxInactiveInterval() / 60;
		
		out.println("세션 유효 시간 : " + time + "분 <br>");
	%>
</body>
</html>

session08.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String sessin_id = session.getId();
	
// 	세션이 마지막 접속된 시간
		long last_time = session.getLastAccessedTime();
// 		세션이 생성이 된 시간
		long start_time = session.getCreationTime();
// 		경과 시간 계산
		long used_time = (last_time - start_time) / 60000;
		
		out.println("세션 아이디  : " + sessin_id + "<br>");
		out.println("요청 시작 시간 : " + start_time + "<br>");
		out.println("요청 마지막 시간 : " + last_time  + "<br>");
		out.println("웹 사이트 경과 시간  : " + used_time + "<br>");
		
	%>
</body>
</html>

쿠키

쿠키

쿠키는 세션과 마찬가지로 클라이언트와 웹 서버간의 상태를 지속적으로 유지하는 방법입니다. 그러나 세션과는 달리 상태 정보를 웹서버가 아닌 클라이언트에 저장을 합니다.

쿠키는 클라이언트의 일정 폴더에 정보를 저장하기 때문에 웹 서버의 부하를 줄일 수 있다는 것이 장점입니다. 반면에 웹 브라우저가 접속했던 웹 사이트에 관한 정보와 개인 정보가 기록되기 때문에 보안에 문제가 있습니다.
이런 보안상의 문제를 해소하기 위해서 웹 브라우저 자체에 쿠키 거부 기능이 추가되었습니다. 하지만 쿠키에 대한 거부가 웹 브라우저에 설정되어 있으면 쿠키 본래의 목적인 웹 브라우저와의 연결을 지속시키는 기능을 수행할 수가 없습니다.

쿠키 동작과정은 쿠키의 생성 단계와 저장 단계, 전송 단계로 나뉩니다.
1. 생성 : 쿠키는 주로 웹 서버측에서 생성을 하는데 생성된 쿠키는 응답 데이터와 함께 저장이 되어서 웹 브라우저에 전송(response)됩니다.
2. 저장 : 웹 브라우저는 응답 데이터에 포함된 쿠키를 쿠키 저장소에 보관을 합니다. 이때 종류에 따라 파일이나 메모리로 저장이 됩니다.
3. 전송 : 웹 브라우저는 한번 저장이 된 쿠키에 대해서는 요청이 있을 때마다 웹 서버에 전송을 합니다. 이때 웹 서버는 웹 브라우저가 전송한 쿠키를 사용해 필요한 작업을 수행할 수가 있습니다.

Cookie클래스의 메서드 종류

메서드 반환 유형 설명
getComment() String 쿠키에 대한 설명을 반환합니다.
getDomain() String 쿠키의 유효한 도메인 정보를 반환합니다.
getMaxAge() int 쿠키의 사용 가능 기간에 대한 정보를 반환합니다.
getName() String 쿠키의 이름을 반환합니다.
getPath() String 쿠키의 유효한 디렉터리 정보를 반환합니다.
getSecure() boolean 쿠키의 보안 설정을 반환합니다.
getValue() String 쿠키에 설정된 값을 반환합니다.
getVersion() int 쿠키의 버전을 반환합니다.
setCommet(String) void 쿠키에 대한 설명을 설정합니다.
setDomain(String) void 쿠키에 유효한 도메인을 설정합니다.
setMaxAge(int) void 쿠키의 유효 기간을 설정합니다.
setPath(String) void 쿠키의 유효한 디렉터리를 설정합니다.
setSecure(boolean) void 쿠키의 보안을 설정합니다.
setValue(String) void 쿠키의 값을 설정합니다.
setVersion(int) void 쿠키의 버전을 설정합니다.
쿠키 생성

쿠키를 사용하려면 먼저 Cookie 클래스를 사용해 쿠키를 생성해야 합니다. 쿠키를 생성하는 데에는 Cookie()메서드를 사용해야하며 쿠키를 생성한 후에는 반드시 response 내장객체의 addCookie() 메서드로 쿠키를 설정해야합니다.

Cookie Cookie(String name, String value)
//첫번째 매개변수 name은 쿠키를 식별하기 위한 이름을 나타내고 두번째 매개변수 value는 쿠키의 값을 나타냅니다.
ex)
Cookie cookie = new Cookie("memberId", "admin");
response.addCookie(cookie);

 

Cookie01.jsp

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

Cookie01_process.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String user_id = request.getParameter("id");
		String user_pw = request.getParameter("passwd");
		
		if(user_id.equals("admin") && user_pw.equals("1234"))
		{
// 			해당 name으로 저장된 변수의 값을 생성(DateType=Cookie)해서 넣는다.
			Cookie cookie_id = new Cookie("userID", user_id);
			Cookie cookie_pw = new Cookie("userPW", user_pw);
			
// 			생성된 참조변수들을  response 내장 객체의 addCookie()메서드에 작성.
			response.addCookie(cookie_id);
			response.addCookie(cookie_pw);
			
			out.println("쿠키 생성이 성공했습니다.<br>");
			out.println(user_id+"님 환영합니다.");
		}
		else
		{
			out.println("쿠키 생성이 실패했습니다.");
		}
	%>
</body>
</html>

'정리 노트 > JSP' 카테고리의 다른 글

11주-3일  (0) 2023.12.20
11주-2일  (0) 2023.12.19
10주-4일차 Filter관련 예제  (0) 2023.12.14
10주차-1일  (0) 2023.12.11
9주차-5일  (0) 2023.12.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
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 31
글 보관함