Cookie & Session

2022. 2. 9. 22:00Spring 기초

쿠키와 세션에 대한 간략한 정리

먼저 쿠키는,

이름과 값의 쌍으로 구성된 정보이다. 

역시나 아스키 문자만 저장 가능하다(한글은 URL 인코딩이 당근 필요하다).

 

구성품은 크게 1) 도메인 2) 경로(PATH) 3) Name - Value  4) 유효기간

 

서버가 생성한 뒤 브라우저로 전송하며, 브라우저에 저장된다. 유효기간 이후 자동 삭제된다.

사용자가 서버에 요청을 보내면, 서버는 도메인과 path가 일치하는 경우 쿠키를 자동 전송한다.

 

쿠키는 쉽게 말하면 클라이언트 식별 기술이다..

//			1. 쿠키를 생성하고
			Cookie cookie = new Cookie("id", id);
			
//			2. 응답에 저장 
			response.addCookie(cookie);

쿠키는 위와 같이 사용하며 아래와 같이 setMaxAge(0)으로 설정 후 전송하면 소멸한다.

//			1. 쿠키를 생성하고
			Cookie cookie = new Cookie("id", id);
			cookie.setMaxAge(0);
//			2. 응답에 저장 
			response.addCookie(cookie);

 


다음은 Session,

세션은 쿠키와 밀접한 관계에 놓여있다. 세션은 쉽게 말하면

서로 관련된 요청-응답을 하나로 묶은 것이다. 요청은 원래 독립적이다. 즉 서로 관계가 없는데,

이 요청들을 쿠키를 이용하여 하나로 묶은 것이다.

 

먼저 브라우저는 개별 저장소(세션 객체)를 서버에서 제공받는다. 세션은 쿠키와 달리 서버에 저장된다.

미리 말하지만, 서버에 저장되므로 편하다고 막 쓰면 서버가 힘들어한다.. 개별 저장소인데다가 서버에 저장되니까

 

브라우저가 요청을 보내면, 서버는 쿠키에 세션 id를 담아 전송한다. 이후 브라우저가 보내는 요청에는

방금 서버로 부터 받은 쿠키가 전송된다. 여기에는 서버한테 받은 세션id가 들어있으므로 서버는 이 요청들이

독립적이 아니라 서로 연관된 것임을 확인한다.  세션id == 연결고리다

 

같은 세션 id를 공유하는 동안은, 같은 세션 객체(세션 저장소)를 사용할 수 있다. 

 

컨트롤러에서 세션 객체를 사용하는 방법은 아래와 같다. 다음과 같이 id의 이름으로 value를 저장하면

저장소에 key-value 형태로 저장된다.

HttpSession session = request.getSession();
		session.setAttribute("id", id);

세션을 request에서 얻어오는 이유는, request 헤더에 세션 정보(세션id)가 담겨있기 때문이다.

 

** 쿠키를 허용하지 않는 브라우저는, 세션 id의 생성이 url을 통해 이루어져야 한다. 앞서 말했듯

세션 id는 서버로부터 쿠키를 통해 전송받는데 쿠키가 차단되었으니 다른 방법을 쓸 수 밖에..

그것이 url을 통해 세션 id를 받는 것이다.

 

근데 그러려면 View 파일에서 form 태그를 <c:url> 태그로 작성해야 자동으로 이루어진다.

안그러면 백날 해도 쿠키 안생김

 

<c:url> 태그로 작성하면 첫 요청시에는 서버가 response에 set-cookie로 쿠키 설정을 요청한다.

하지만 쿠키는 차단되어있으니 url로 session id 전송이 자동으로 이루어진다.

<form action="/login/login;jsessionid=08C863E75C7000AB8038A2D21640E867" method="post" onsubmit="return formCheck(this);">

위는 작성한 코드가 아니라 태그가 자동으로 처리해준 결과이다.

 

 

 

만약, 세션이 필요없는 페이지라면?

세션은 앞서 언급한 것 처럼 적게 쓸수록 좋다. 

세션이 필요없는 페이지라면 session = false를 주자.

원하는 View 파일에 가서

<%@ page session = "false" %>

한 줄 선언하면 된다.

 

다만, 세션이 없을때 true값은 세션을 생성하고, false는 생성을 막는다.

하지만 이미 세션이 시작한 경우라면, false는 새로운 세션을 생성하지 않을 뿐, 기존에 생성된 세션을

없애는 것이 아니므로 큰 의미는 없겠다.