Web-Cookie And Session
Goal
- Cookie와 Session이 왜 필요한 이유
- Cookie란 무엇인지에 대해 이해한다
- Session이란 무엇인지에 대해 이해한다
- Cookie와 Session의 차이에 대해 이해한다
쿠키와 세션의 사용 이유
HTTP 프로토콜의 특징
- 비연결지향(Conectionless)
- HTTP는 클라이언트가 요청(Request)을 서버에 보내고, 서버는 클라이언트에 요청에 맞는 응답(Response)를 보내면 바로 연결을 끊는다
- 상태 정보를 유지 안 함(Stateless)
- 연결을 끊는 순간 클라이언트와 서버의 통신은 끝나면 상태 정보를 유지하지 않는다
쿠키와 세션의 필요성
- HTTP 프로토콜은 위와 같은 특징으로 모든 요청간의 의존관계가 없다
- 즉, 현재 접속한 사용자가 이전에 접속했던 사용자와 같은 사용자인지 아닌지 알 수 있는 방법이 없다
- 계속해서 연결을 유지하지 않기 때문에 리소스 낭비가 줄어드는 것이 큰 장점이지만, 통신할 때마다 새로 연결하기 때문에 클라이언트는 매 요청마다 인증을 해야한다는 단점이 있다
- 이전 요청과 현재 요청이 같은 사용자의 요청인지 알기 위해서는 상태를 유지해야한다
- HTTP프로토콜에서 상태를 유지하기 위한 기술로 쿠키와 세션이 있다
쿠키 (Cookie)
쿠키란?
- 쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일한다
- 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 쿠키가 유지된다는 특징이 있다
- 쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 참조한다
구성요소
- 쿠키의 이름(name)
- 쿠키의 값(value)
- 쿠키의 만료시간(Expire)
- 쿠키를 전송할 도메인 이름(Domain)
- 쿠키를 전송할 경로(Path)
- 보안 연결 여부(Secure)
- HttpOnly 여부(HttpOnly)
세션쿠키(Session Cookie)와 지속 쿠키(Persistent Cookie)
- 지속 쿠키
- 만료 날짜/시간을 지정하지 않으면 항상 유지하라는 것으로 판단하고 지속 쿠키에 저장된다
- 파일로 저장되므로 브라우저가 종료되어도 쿠키는 남아있다
- 세션 쿠키
- 만료 날짜/시간을 지정하면 세션 쿠키로 저장된다
- 브라우저 메모리에 저장되므로 브라우저가 종료되면 쿠키는 사라지게 된다
동작 방식
- 웹 브라우저가 서버에 요청
- 상태를 유지하고 싶은 값을 쿠키(Cookie)로 생성
- 서버가 응답할 때 Http Response Header의 Set-Cookie에 쿠키를 포함해서 전송
1
Set-Cookie: id=chan
- 전달받은 쿠키는 웹 브라우저에서 관리하고 있다가, 다음 요청 때 쿠키를 Http 헤더에 넣어서 전송
1
cookie: id=chan
- 서버에서는 쿠키 정보를 읽어 이전 상태 정보를 확인 후 응답
쿠키 사용 예
- 아이디, 비밀번호 저장
- 쇼핑몰 장바구니
쿠키의 제약사항
클라이언트에 최대 300개까지 쿠키를 저장할 수 있다
서버 도메인 하나당 최대 20개의 쿠키를 저장할 수 있다
하나의 쿠키 값은 최대 4KB까지 저장할 수 있다
쿠키는 사용자가 별도로 요청하지 않아도 브라우저(Client)에서 서버에 요청시 Request Header에 쿠키 값을 자동으로 넣어 보낸다
그렇다고 모든 쿠키 값을 모든 요청에 넣어서 비효율적으로 동작하지 않고 지정 도메인에 해당하는 쿠키 값만을 제공한다
세션(Session)
세션이란?
- 세션은 쿠키를 기반으로 동작하지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리한다
- 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지한다
- 접속 시간에 제한을 두어 일정 시간 응답이 없다면 정보가 유지되지 않게 설정이 가능하다
- 사용자에 대한 정보를 서버에 두기 때문에 쿠키보다 보안에 좋지만, 사용자가 많아질수록 서버 메모리를 많이 차지하게 된다
- 동접자 수가 많은 웹 사이트인 경우 서버에 과부하를 주게 되므로 성능 저하의 요인이 된다
- 클라이언트가 Request를 보내면, 해당 서버 엔진이 클라이언트에게 유일한 ID를 부여하는데 이것이 세션이다
동작 방식
- 웹 브라우저가 서버에 요청
- 서버가 해당 웹 브라우저(클라이언트)에 유일한 ID(Session ID)를 부여함
- 서버가 응답할 때 HTTP Header(Set-Cookie)에 Session ID를 포함해서 전송
- 쿠키에 Session ID를 JSESSIONID라는 이름으로 저장
1
Set-Cookie : JSESSIONID=g3r2sddh
- 쿠키에 Session ID를 JSESSIONID라는 이름으로 저장
- 웹 브라우저는 이후 웹 브라우저를 닫기까지 다음 요청 때 부여된 Session ID가 담겨있는 쿠키를 HTTP Header에 넣어서 전송
1
Cookie : JSESSIONID=g3r2sddh
- 서버는 세션 ID를 확인하고, 해당 세션에 관련된 정보를 확인한 후 응답
세션도 쿠키를 사용하여 값을 주고받으며 클라이언트의 상태 정보를 유지한다
즉, 세션이 상태 정보를 유지하는 수단으로 쿠키를 사용한다
쿠키와 세션의 차이
- 저장 위치
- 쿠키는 클라이언트(브라우저)의 메모리 또는 파일에 저장
- 세션은 서버 메모리에 저장
- 보안
- 쿠키는 로컬에 저장되고, 특히 파일로 저장되는 경우가 있어 탈취, 변조에 위험하고 Request/Response시에 스니핑당할 위험이 있다
- 세션은 클라이언트 정보 자체가 서버에 저장되어 있으므로 비교적 안전하다
- 라이프 사이클
- 쿠키중 지속 쿠키는 브라우저가 종료하더라도 저장되어있다
- 세션은 만료시간/날짜를 정해서 기간이 지나면 자동으로 삭제하고 세션쿠키에서 세션 아이디를 정한 경우, 브라우저 종료시 세션아이디가 삭제된다
- 속도
- 쿠키는 클라이언트에 저장되어 있기 때문에 서버 요청시 속도가 빠르다
- 세션은 정보가 서버에 있기 때문에 처리가 요구되어 비교적 느린 속도를 낸다
참고 - 캐시
- 브라우저 캐시는 이미지(.png, .jpg)나 css, js파일등이 사용자의 브라우저에 저장되는 것이다
- 이를 이용해서 같은 자원을 로드(load)해야할 경우에, 해당 자원을 다시 서버에 요청하지 않고 브라우저에 캐시되어 있는 자원을 쓰는 방식이다
- 자원이 브라우저 캐시에 저장되면 브라우저에 있는 결 재사용하기 때문에 경우에 따라서 자원이 변경되어도 변경된 자원을 참조할 수 없는 경우가 있다
- 따라서 사용자는 브라우저 캐시를 지워주거나 서버에서 클라이언트에 응답을 보낼 때 header에 자원 캐시 만료시간을 명시하는 방식을 사용하여 위와같은 문제를 해결할 수 있다