너굴 개발 일지

TIL_210423_쿠키, 세션 본문

JSP,Serlvet

TIL_210423_쿠키, 세션

너굴냥 2021. 4. 27. 00:02

Cookie(쿠키), Session(세션)

클라이언트 단위상태정보를 유지하게 하려먼 쿠키와 세션을 사용

아래와 같은 기준에 따라 선택하여 사용

 

- 상태정보의 유지 기간이 브라우저가 종료될 때까지인지의 여부

- 유지하려는 정보의 저장 위치(서버, 클라이언트)

- 유지하려는 정보가 공개되어도 되는지의 여부

 

구분 쿠키 세션
저장 위치 클라이언트 서버
저장 데이터 타입 텍스트 객체
저장 데이터 크기 제한 있음 서버에서 수용할 수 있는 만큼

 

 

쿠키 속성

서버가 클라이언트에 저장하는 정보로 클라이언트 쪽에 필요한 정보를 저장해놓고 필요할 때 추출하는 것을 지원하는 기술로, 클라이언트와의 연결이 끊어져도 클라이언트마다 개별적으로 상태 정보를 유지하고자 할 때 활용

쿠키는 name, value로 구성된 정보로 브라우저에 저장되는 용량에 한계가 있고, 클라이언트가 직접 쿠키 정보를 점검할 수 있어서 보안상의 문제가 있다

 

 

 

쿠키 생성

1) 쿠키 객체 생성

Cookie c = new Cookie("name", "value");

2) 쿠키 유효 시간 설정

setMaxAge() 메소드의 매개변수는 second(초)이며 유효 시간이 지나면 쿠키는 소멸된다

c.setMaxAge(5);

3) 쿠키 전송

클라이언트쪽으로 쿠키 전송됨

response.addCookie(c);
response.addCookie(new Cookie("pwd", "1111"));

예시

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>웹 브라우저에 쿠키 전송</title>
</head>

<body>
	<%
		// 1. 쿠키 객체 생성
		Cookie c = new Cookie("id", "1234");
	
		// 2. 쿠키 수명 설정
		c.setMaxAge(500);
	
		// 3. 쿠키 내보내기 (웹 브라우저에 전송)
		response.addCookie(c);
		
		response.addCookie(new Cookie("pwd", "1111"));
		response.addCookie(new Cookie("age", "20"));
	%>
</body>
</html>

 

쿠키 추출

1) 쿠키 추출

Cookie[] cookies = request.getCookies();

2) 쿠키 검색

(Cookie)c.getName();

3) 쿠키 값 추출

먼저 원하는 쿠키를 이름으로 검색하여 찾은 후 쿠키 값을 추출하여 사용해야 함

(Cookie)c.getValue();

예시

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>웹 브라우저에 저장된 쿠키 꺼내기</title>
</head>

<body>
	<%
		Cookie[] cookies = request.getCookies();
		for(Cookie c : cookies){
			out.print(c.getName() + " : " + c.getValue() + "<br />");
		}
	%>
</body>
</html>

 

session(세션)

HTTP 기반으로 동작하는 클라이언트가 서버에 정보를 요청할 때 생성되는 "상태정보"를 세션이라 하며

쇼핑몰 사이트의 장바구니 기능, 로그인 또는 로그아웃처럼 사용자 인증 처리를 하는 경우에 세션을 사용

(세션은 저장소가 다르기에 브라우저 상에서 세션값 확인 불가)

 

session 관련 메서드

메소드 기능
public Object getAttribute("String name") getAttribute() 메소드의 인자값으로 지정된 데이터 값을 반환
public void setAttribute("String name","Object value") session 객체에 name으로 지정된 이름으로 value 값을 등록
public void removeAttribute("String name") session 객체에서 name으로 지정된 객체 삭제
public Enumeration getAttributeNames() session 객체에 등록된 모든 정보의 이름만을 반환
public String getId() session 객체에 지정된 세션 id 반환
public long getLastAccessedTime() 클라이언트 요청이 마지막으로 시도된 시간을 밀리초 단위로 반환
public long getCreationTime() session 객체가 생성된 시간을 밀리초 단위로 반환
public int getMaxInactiveInterval() 클라이언트 요청이 없을 때 서버의 세션 수명 시간 (초단위) 지정
기본 유효 시간은 30분
public boolean isNew() 서버 측에 새로운 세션을 생성한 경우 true
기존 세션 유지라면 false 반환
public void invalidate() 현재의 세션을 삭제한다

 

setAttribute() 예시

03_setSession.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>웹서버의 어플리케이션 영역</title>
</head>

<body>
JSP는 세션 객체 미리 설정되어 있음 (내장객체) <br />
쿠키처럼 객체 생성할 필요 없음 <br />
<%
	session.setAttribute("id", "test"); // => Object -> 형변환 필요(String)
	session.setAttribute("age", 10);    // => Object -> 형변환 필요(Integer)

%>
</body>
</html>

getAttribute(), removeAttribute() 예시

04_getSession.jsp

<%@ 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>
	<h2>세션 값 추출</h2>
	<%
		String id = (String)session.getAttribute("id");
		int age = (int)session.getAttribute("age");
		session.removeAttribute("id");
	%>
	아이디 : <%= id %>
	<br />
	나이 : <%= age %>
</body>
</html>

03_setSession 실행 후 04_getSession 실행 결과

 

Q) 04_getSession.jsp에서 id 값을 삭제하였는데 결과 화면에 출력되는 이유는 ?

코드를 보면 session의 id값을 먼저 호출한 후 삭제하였기에 화면엔 나오지만 04_getSession.jsp를 다시 실행한다면 id 값도 출력되지 않을 것이다

 

getAttributeNames() 예시

<%@ 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>
	<%
		Enumeration<String> names = session.getAttributeNames();
		while(names.hasMoreElements()){
			String name = names.nextElement().toString(); // 세션이름 추출
			String value = session.getAttribute(name).toString(); // id는 삭제하였기에 age만 추출 
			out.print(name + " : " + value);
		}
	%>
</body>
</html>

04_getSession.jsp에서 id의 값을 삭제했기에 age와 그에 대한 값만 반환되는 것을 볼 수 있다

 

그외 메서드 적용 예시

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>세션 정보 얻기</title>
</head>

<body>
	<h3>세션 정보를 얻어내서 출력</h3>
	<%
		String id_str = session.getId(); // 세션 아이디
		long lastTime = session.getLastAccessedTime(); // 최종 접속 시간
		
		long createTime = session.getCreationTime(); // 처음 접속 시간
		long time_used = (lastTime - createTime) / 60000; // 최종 - 처음 = 경과 시간
		int inactive = session.getMaxInactiveInterval() / 60; // 세션 기본 수명
		
		boolean n = session.isNew(); // 새로운 세션 추가했는지 여부 
	%>
	
	1. 세션아이디 : <%= id_str %> <br />
	2. 현 페이지 머문 시간 : <%= time_used %> <br />
	3. 세션 유효시간 : <%= inactive %> <br />
	4. 새로운 세션 여부 : 
	<%
		if(n){
			out.print("새로운 세션");
		}else{
			out.print("새로운 세션 없음");
		}
	
	%>
</body>
</html>