[WEB] Cookie & Session

young-gue Park·2023년 9월 6일
0

Web-BackEnd

목록 보기
3/7
post-thumbnail

⚡ Cookie & Session


자바스크립트(쿠키와 로컬,세션 저장소)

📌 쿠키

⭐ Http Protocal

🔷 비연결(connectionless) 지향형 통신 프로토콜

🔷 응답 후 연결을 종료! (stateless)

  • 지속적인 연결 유지로 인한 자원낭비 방지를 위해 연결 해제
  • 연결이 해제되면 서버는 클라이언트 정보를 알 수 없음

이러한 문제 해결을 위해서 Cookie와 HttpSession을 활용한다.

javax.servlet.http.Cookie

🔷 서버가 생성하는 클라이언트 정보를 가지고 있는 파일

  • 클라이언트 컴퓨터에 저장되며, 필요에 따라 요청 시 서버로 같이 전송된다.
  • key-value 형태로 구성되며 문자열 데이터이다.
  • 브라우저(클라이언트) 별로 별도의 쿠키가 생성된다. (브라우저가 다르면 다른 사용자로 처리)
  • 세션관리(사용자 아이디, 접속시간, 장바구니 등)을 위해 사용된다.
  • 사용자마다 다른 페이지를 보여줄 수 있다.
  • 사용자의 행동과 패턴을 분석하고 기록하는데 사용된다.

🔷 Cookie 동작 순서
1) Client가 요청 생성
2) WAS는 Cookie를 생성하고 Http Header에 Cookie를 넣어 응답
3) Client(Browser)는 Cookie를 저장, 해당 서버에 요청할 때 요청과 함께 Cookie를 전송
4) Cookie는 브라우저가 종료되더라도 계속 저장되기 때문에(만료기간 전까지) 동일 사이트 재 방문하여 요청 시 필요에 따라 Cookie가 재 전송된다.

🔷 Cookie 특징

  • 이름(key), 값(value), 만료일(Expire date, 저장기간), 경로정보로 구성
  • 클라이언트에 최대 300개의 쿠키를 저장할 수 있다.
  • 하나의 도메인당 20개의 쿠키를 저장할 수 있다.
  • 쿠키 하나는 4KB까지 저장 가능하다.

🔷 Cookie 생성 및 추가

🖥 쿠키 생성

Cookie cookie = new Cookie("userid", "Bzeromo");

🖥 쿠키 응답에 추가

response.addCookie(cookie);

🔷 Cookie 주요 메서드

메서드설명
void setComment(String comment)쿠키에 대한 설명 설정
void setDomain(String domain)쿠키의 유효한 도메인 설정
void setMaxAge(int expiry)쿠키 유효기간 설정
void setPath(String path)쿠키 유효 디렉토리 설정
void setValue(String value)쿠키 값 설정
String getComment()쿠키 설명 반환
String getDomain()쿠키 유효 도메인 반환
int getMaxAge()쿠키 유효기간 반환
String getPath()쿠키 유효 디렉토리 반환
String getValue쿠키 값 반환

🖥 쿠키 실습

package com.ssafy.makecookie;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/make")
public class MakeCookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
 
    public MakeCookieServlet() {
        super();
    }

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String key = request.getParameter("key");
		String value = request.getParameter("value");
		
		Cookie cookie = new Cookie(key, value);
		cookie.setMaxAge(10); // 초단위
		
		response.addCookie(cookie);
		
		response.sendRedirect("01_cookie.jsp");
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

🍪 하나를 구워보자.

쿠키가 잘 들어와있다. 그리고 10초가 지나면...

사라진다!


📌 HttpSession

javax.servlet.http.HttpSession

🔷 사용자가 웹 서버에 접속해 있는 상태를 하나의 단위보고 세션이라고 한다.

  • 각 세션은 sessionid를 이용해 구분한다.
  • WAS의 메모리에 객체 형태로 저장
  • 메모리가 허용하는 용량까지 제한없이 저장 가능
  • 쿠키는 클라이언트에 저장되기 때문에 공유 PC의 경우 보안에 취약할 수 있다. 하지만 세션은 서버에 저장되기 때문에 쿠키에 비해 보안이 좋다.
  • 사용자(로그인)정보 및 장바구니 등에 사용한다.

🔷 Session 동작 순서
1) 클라이언트가 페이지를 요청
2) 서버는 쿠키에 session id가 있는지 확인한다.
3) session id가 존재하지 않으면 session id를 생성해 쿠키에 쓴 다음 클라이언트로 반환
4) 생성된 session id를 이용하여 서버 내 메모리를 생성
5) 클라이언트가 다음 요청 시 쿠키에 session id(JSESSIONID)를 포함해 전달하면 서버 내에 저장된 session id와 비교하여 데이터를 조회

🔷 session 설정

  • 브라우저 당 하나의 JSESSIONID를 할당 받는다.
  • 아이디 또는 닉네임과 같이 로그인했을 경우 자주 사용되는 정보를 session에 저장하면 db에 접근할 필요가 없으므로 효율적이다.

🔷 session 사용하기

  • 요청 객체로부터 session 객체를 얻어온다.
  • session에 데이터를 설정하여 저장한다.
HttpSession session = request.getSession(); 
session.setAttribute("userid", "Bzeromo");

❗ 서블릿에서 session을 인스턴스명으로 사용하려하면 에러가 뜬다. 예약어이기 때문.
따라서 바로 session.메서드 로 이용하거나 인스턴스명을 다른 이름으로 하는 것이 맞다.

  • session에서 값을 반환하는 getAttribute 메서드는 반환형이 Object이다.
String userid = (String)session.getAttribute("userid");

🔷 Session 주요 메서드

메서드설명
void setAttribute(String name, Object valuesession에 지정한 name에 해당하는 객체를 추가
void setMaxInactiveInterval(int interval)사용자가 다음 요청을 보낼 때까지 세션을 유지하는 최대시간(초단위)을 설정
void invalidate()현재 세션을 없애고 속성도 삭제
String getId()현제 세션의 고유 id를 반환
long getLastAccessTime()현재 세션에 클라이언트가 마지막으로 요청을 보낸 시간을 반환(long)
Object getAttribute(String name)name에 해당하는 속성값 반환, 반환형이 Object 임에 유의
long getCreationTime()세션이 만들어진 시간 반환
void removeAttribute(String name)세션에서 지정한 이름의 객체를 제거
Enumeration getAttributeNames()세션에서 모든 객체의 이름을 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>
	<h3>세션 정보를 얻어오는 메소드를 사용하기</h3>
	<%
		String id_str = session.getId();
		long lasttime = session.getLastAccessedTime();
		long createdtime = session.getCreationTime();
		long time_used = (lasttime - createdtime) / 60000;
		int inactive = session.getMaxInactiveInterval() / 60;
		boolean b_new = session.isNew();
	%>
	[1] 세션 ID는 [
	<%=session.getId()%>] 입니다.
	<br>
	<hr>
	[2] 당신이 웹 사이트에 머문 시간은
	<%=time_used%>
	분입니다.
	<br>
	<hr>
	[3] 세션의 유효 시간은
	<%=inactive%>
	분입니다.
	<br>
	<hr>
	[4] 세션이 새로 만들어졌나요?
	<br>
	<%
		if (b_new)
			out.print(" 예! 새로운 세션을 만들었습니다.");
		else
			out.print(" 아니오! 새로운 세션을 만들지 않았습니다.");
	%>
</body>
</html>

로그인&로그아웃 기능에 매우 유용할듯하다.

profile
Hodie mihi, Cras tibi

0개의 댓글