평범한 연구소

[Javascript] 쿠키와 세션 본문

Pront/Javascript

[Javascript] 쿠키와 세션

soyeonisgood 2022. 10. 8. 13:47

쿠키 (Cookie)

  • 쿠키는 클라이언트에 대한 정보를 클라이언트의 로컬에 저장한 text 파일
  • 쿠키는 텍스트 형태로 저장되기 때문에 변조, 복사 가능 → 보안성 없음
  • 서버에서 사용자에게 편리한 기능을 제공하기 위해 많이 사용, 웹브라우저에 의해 관리된다.
  • 브라우저는 각 웹서버(도메인)당 20개의 쿠키, 클라이언트에 총 300개의 쿠키를 지원. 쿠키의 크기는 각 4KB(4096byte)까지 저장 가능.
  • 쿠키 정보는 javax.servlet.Cookie 클래스에 의해 관리된다.

 

세션 (Session)

  • 둘 이상의 page request에서 사용자를 식별하거나, 웹사이트를 방문하고 해당 사용자에 대한 정보를 저장하는 방법 제공.
  • Servlet container는 HttpSession를 사용하여 HTTP client - HTTP server 간의 세션을 생성.
  • 세션은 한 명의 사용자. (브라우저 당 하나의 세션 객체 생성)
  • 서버는 Cookie, rewriting URL와 같은 방법으로 세션을 유지하면서 관리할 수 있다.
  • 객체를 세션에 바인딩하여 사용자 정보를 유지할 수 있다.

 

쿠키와 세션의 차이는 ? 

  • 사용자의 정보가 저장되는 위치
    • 쿠키: 서버의 자원 전혀 사용하지 않음.
    • 세션: 서버의 자원 사용.
  • 보안성은 세션이 더 우수.
    • 쿠키: 클라이언트의 로컬에 저장됨. 변질되거나 스니핑의 가능성 있음.
    • 세션: 쿠키를 이용해서 session-id만 저장하고 그것으로 구분하여 서버에서 처리.
  • 라이프 사이클
    • 쿠키: 브라우저 종료해도 정보 유지. 만료기간 지정 가능.
    • 세션: 브라우저가 종료되면 삭제.

 


Cookie 관련 예제

 

javax.servlet.http.Cookie 클래스 주요 메소드

setMaxAge() 쿠키의 보존 시간(초) 설정. 기본값은 브라우저가 종료될 때 까지 쿠키가 지속되는 -1.
setPath() 클라이언트가 쿠키를 리턴해야하는 쿠키의 경로 지정. 기본은 쿠키를 설정한 페이지의 디렉토리인 현재 URL 및 아래의 모든 하위 티렉토리.
getValue() 쿠키의 값 반환.
getName() 쿠키의 이름 반환.

 

Cookie 설정하기

  • Cookie 객체 생성 : Cookie c = new Cookie(name, value)
  • 한글은 인코딩, 디코딩 필수.
Cookie c1 = new Cookie("subject", "java"); // 쿠키이름,값 : 쿠키는 String 만 가능

Cookie c2 = new Cookie("subject3", URLEncoder.encode("오라클", "UTF-8"));
  • 쿠키 유효 기간 설정 : setMaxAge(ms)
c1.setMaxAge(60*60); // 쿠키 유효시간 (단위:초)

c2.setMaxAge(-1); // -1: 브라우저가 종료되면 쿠키 제거(기본)

c3.setMaxAge(0); // 쿠키생성과 동시에 제거. 일반적으로 쿠키를 제거할 때 0으로 설정
  • HTTP 응답 헤더에 쿠키 보내기
response.addCookie(c1);

 

Cookie 가져오기

  • HttpServletRequest 인터페이스의 getCookie() 이용
    • Cookie[] cc = request.getCookies()
    • cc.getName()
    • cc.getValue()
Cookie[] cc = request.getCookies();

if( cc != null) {
	for(Cookie c : cc) {
		String name = c.getName(); 
		String value = c.getValue(); 
			
		if(name.startsWith("product")) {
			value = URLDecoder.decode(value, "utf-8");
			out.print("<p>" + value + "</p>");
		}
	}
}

 

Cookie 제거하기

  • 쿠키의 값 지우고 유효기간 만료 시키면 된다.
    • Cookie cc = new Cookie(제거할쿠키이름, null) // 쿠키값 지우기
    • cc.setMaxAge(0) // 유효시칸 만료
    • response.addCookie(cc) // HTTP 응답 헤더에 제거할 쿠키를 보낸다.
Cookie c1 = new Cookie("subject", null); 
c1.setMaxAge(0);
response.addCookie(c1);

// 쿠키 생성 시 setPath("/") 로 모든경로에서 쿠키 접근 가능하도록 설정한 경우, 지울때도 써줘야함.
Cookie c4 = new Cookie("tel", null); 
c4.setPath("/");
c4.setMaxAge(0);
response.addCookie(c4);

 

 


Session 관련 예제

 

javax.servlet.http.HttpSession 인터페이스 주요 메소드

 

isNew() true는 클라이언트 세션 ID를 할당하지 않은 경우.
false는 이미 세션이 설정되어 있는 경우.
만약, 서버가 쿠키 기반의 세션만 사용하고 클라이언트가 쿠키 사용을 비활성화 한 경우 각 요청에서 세션이 새로운 것이므로 true.

getAttribute() 세션에 지정된 이름으로 바인드된 객체를 반환, 주어진 이름으로 바인드된 객체가 없으면 null 반환.
getId() 세션에 할당된 고유 식별자가 포함된 문자열 반환.
getMaxInactiveInterval() 서블릿 컨테이너의 세션을 유지할 시간을 초단위로 반환.
getCreationTime() 세션이 생성된 시간을 반환.
getLasAccessedTime() 클라이언트가 세션과 관련된 요청을 보낸 마지막 시간 반환. 컨테이너가 요청받은 시간으로 표시.
setAttribute() 지정된 이름을 사용하여 세션에 주어진 객체 바인딩.
setMaxInactiveInterval() 서블릿 컨테이너가 세션을 유지할 시간을 interval에 설정된 초 값으로 설정. 기본값 1800초.
removeAttribute() 특정 속성 지우기.
invalidate() 세션 무효화. 세션에 바인드된 모든 객체의 바인딩 해제.

 

세션 객체 받아오기

  • Servlet : HttpSession session = request.getSession()
  • EL : sessionScope
// ex12_set.jsp
<%
	// 세션 유지시간 설정. 톰캣은 기본 30분
	session.setMaxInactiveInterval(60*20); // 20분으로 
	
	// 세션에 정보 저장
	session.setAttribute("name", "홈자바"); // setAttribute(String, Object)
	session.setAttribute("age", 20);
%>


// ex12_get.jsp
<%
	String name = "";
	int age = 0;
	try{
		// 세션에 저장된 값 가져오기
		name = (String)session.getAttribute("name"); // 리턴타입 Object
		age = (Integer)session.getAttribute("age");
	} catch(Exception e) {	
	}
	
	// 세션 유지 시간
	int interval = session.getMaxInactiveInterval();
	
	// 세션아이디
	String id = session.getId();
	
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	String reg_date = sdf.format(new Date(session.getCreationTime()));
	String last_date = sdf.format(new Date(session.getLastAccessedTime()));
%>


// ex12_remove.jsp
<%
	// 하나씩 지울 경우엔
	// session.removeAttribute("이름");

	// 세션에 저장된 모든 속성값을 지우고 초기화
	session.invalidate();
%>