웹에서 쿠키와 세션이 등장한 배경
1. HTTP의 Stateless 한계를 극복하기 위한 기술
2. 로그인 후 세션이 자동으로 종료되므로 내 정보를 눌렀을 때 서버에서 식별이 어려움
3. 쿠키라는 기술이 먼저 사용된 후 보안이 고려된 세션이라는 기술이 주로 사용되고 있음
4. 쿠키와 세션 모두 클라이언트를 식별하기 위한 기술
- 쿠키(Cookie)
쿠키는 인터넷 사용자가 웹사이트를 방문할 때, 클라이언트(사용자) 로컬에 저장되는 키와 값이 들어있는 작은 임시 데이터 파일입니다.
구성요소
1)이름 : 쿠키값을 구별할 때 사용하는 이름
2) 값 : 쿠키의 이름과 관련된 값(id,pw,level 등)
3) 유효시간 : 쿠키의 유지시간
4) 도메인 : 쿠키를 전송할 도메인
5) 경로 : 쿠키를 전송할 요청 경로
쿠키는 일정시간동안 데이터를 저장할 수 있다. (로그인 상태 유지에 활용)
상태 정보를 클라이언트에 저장하는 방식 (이외 * 뷰상태, 컨트롤상태, 숨겨진필드, 쿼리 문자열)
- 쿠키 프로세스
쿠키 동작 방식
1) 클라이언트가 페이지를 요청
2) 서버에서 쿠키 값을 생성
3) 서버 응답줄 때 HTTP 응답 헤더에 쿠키를 넣어서 클라이언트에게 전달
4) 같은 요청을 할 경우 HTTP 요청헤더에 받았던 쿠키를 함께 서버에 보냄
5) 서버는 전달받은 쿠키값을 읽어서 해당하는 요청을 처리함
- 쿠키 사용 사례
* 자동로그인, 팝업에서 "오늘 더 이상 이 창을 보지 않음" 체크, 쇼핑몰의 장바구니
- 쿠키의 제한
* 클라이언트에 300개까지 쿠키저장 가능, 하나의 도메인당 20개의 값만 가질 수 있음, 하나의 쿠키값은 4KB까지저장
Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있습니다.
쿠키는 사용자가 따로 요청하지 않아도 브라우저가 Request시에 Request Header를 넣어서 자동으로 서버에 전송합니다.
- 세션(Session)
일정 시간동안 같은 브라우저로 부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지하는 기술
즉, 웹 브라우저를 통해 웹 서버에 접속한 이후로 브라우저를 종료할 때 까지 유지되는 상태
클라이언트가 Request를 보내면, 해당 서버의 엔진이 클라이언트에게 유일한 ID를 부여하는 데 이것이 세션ID입니다.
상태 정보를 웹 서버에 저장하는 방식 (이외 * 응용 프로그램상태, 프로필속성, 데이터베이스)
- 세션 프로세스
세션 동작 방식
1) 클라이언트가 서버쪽 페이지를 요청
2) 서버에서 세션토큰을 만듬
- 세션토큰: 아이디, 패스워드, 사용자ip, 로그인 date-time등으로 이루어진 고유의 값을 만듦
- 세션토큰은 서버에 저장되고 관리됨
- 클라이언트에게는 세션토큰이랑 매핑되는 세션아이디를 발급해줌
- 다시 클라이언트가 세션아이디가 포함된 요청을 서버로 보냄
- 서버에서는 세션아이디에 해당하는 서버에 저장된 세션토큰값을 읽고 그 사용자를 식별함
3) 서버 응답줄 때 HTTP 응답 헤더에 쿠키를 넣어서 클라이언트에게 전달
4) 같은 요청을 할 경우 HTTP 요청헤더에 받았던 쿠키를 함께 서버에 보냄
5) 서버는 전달받은 쿠키값을 읽어서 해당하는 요청을 처리함
- 세션 사용 사례
로그인 정보 유지
쿠키와 세션의 차이
저장 위치, 쿠키는 클라이언트에 파일로 저장, 세션은 서버에 저장
이것만 아셔도 괜찮습니다.
보안, 쿠키는 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스나이핑 당할 우려가 있어서 보안에 취약하지만 세션은 쿠키를 이용해서 sessionid 만 저장하고 그것으로 구분해서 서버에서 처리하기 때문에 비교적 보안성이 좋습니다.
라이프 사이클, 쿠키도 만료시간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 계속해서 정보가 남아 있을 수 있다. 또한 만료기간을 넉넉하게 잡아두면 쿠키삭제를 할 때 까지 유지될 수도 있습니다.
반면에 세션도 만료시간을 정할 수 있지만 브라우저가 종료되면 만료시간에 상관없이 삭제됩니다.
속도, 쿠키에 정보가 있기 때문에 서버에 요청시 속도가 빠르고 세션은 정보가 서버에 있기 때문에 처리가 요구되어 비교적 느린 속도를 냅니다.
* 세션을 주로 사용하면 좋은데 왜 쿠키를 사용할까?
- 세션은 서버의 자원을 사용하기때문에 무분별하게 만들다보면 서버의 메모리가 감당할 수 없어질 수가 있고 속도가 느려질 수 있기 때문입니다.
* 쿠키,세션은 캐시와 엄연히 다릅니다.
캐시는 이미지나 css, js파일 등이 사용자의 브라우저에 저장이 되는 것 입니다.
이를 이용해 자원이 아껴지는 것, 한번 캐시에 저장되면 브라우저를 참고하기 때문에 서버에서 변경이 되어도 사용자는 변경되지 않게 보일 수 있는데 이런 부분을 캐시를 지워주거나 서버에서 클라이언트로 응답을 보낼 때 header에 캐시 만료시간을 명시하는 방법등을 이용할 수 있습니다.
감사합니다.