HTTP의 특징
1) Stateless 프로토콜
2) Connectionless 프로토콜
- 클라이언트가 서버에 요청(Request)을 했을 때, 그 요청에 맞는 응답(Response)을 보낸 후 연결을 끊는 처리 방식이다.
HTTP 1.1 버전에서 연결을 유지하고, 재활용 하는 기능이 Default로 추가되었다. (keep-alive 속성으로 변경 가능)
하지만, 실제로는 데이터 유지가 필요한 경우가 많다.
- ex-1) 정보가 유지되지 않으면, 매번 페이지를 이동할 때마다 로그인을 다시 해야한다.
- ex-2) 상품을 선택했는데 구매 페이지에서 선택한 상품의 정보가 없을 수 있다.
따라서, Stateful 경우를 대처하기 위해서 쿠키와 세션을 사용한다.
- 쿠키와 세션의 차이점은 크게 상태 정보의 저장 위치이다.
- 쿠키 : 클라이언트 (=로컬, 사용자 브라우저)에 저장한다.
- 세션 : 서버에 저장한다.
Cookie (쿠키)
정의
- 클라이언트 (사용자의 브라우저)에 저장되고, 통신할 때 HTTP 헤더에 포함되는 텍스트 데이터 파일이다.
특징
- 키와 값으로 구성되어 있다.
- 이름, 값, 만료기간(지정 가능), 경로 등에 대한 정보가 포함되어 있다.
- 보안성이 낮다.
- 해당 사용자의 컴퓨터를 사용한다면, 누구나 쿠키에 입력된 값을 쉽게 확인 가능하다.
쿠키 통신 방법
- 최초 통신에서는 쿠키 값이 없으므로, 일단 클라이언트는 Request를 서버에게 전송한다.
- 서버에서 클라이언트의 Request에 쿠키 값이 없는 것을 판별한다.
쿠키 값이 없다면, 통신상태(UserID, Password, 조작 상태, 방문횟수 등)를 저장한 쿠키를 Response에 담아 클라이언트에게 전송한다.
- 클라이언트의 브라우저는 서버로부터 받은 쿠키를 생성 / 보존한다.
- 두번째 연결부터. HTTP Header에 쿠키를 담긴 Request를 서버에게 전송한다.
쿠키 제약 조건
- 클라이언트는 총 300개의 쿠키를 저장할 수 있다.
- 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
- 20개가 넘으면 가장 적게 사용되는 것 부터 삭제된다.
- 하나의 쿠키는 4KB(4096Byte)의 데이터를 저장할 수 있다.
쿠키 사용 예시
- 자동 로그인 유지, 위시 리스트 저장, 팝업 보지 않기, 사용자 이전 스크롤 위치 유지, 뷰 설정, 등
Session (세션)
정의
- 서버에 저장되는 쿠키로, 중요한 데이터를 저장 시 사용된다.
- 중요한 데이터 : 클라이언트와 서버의 통신 상태, ...
특징
- 보안성이 비교적 높다.
- 서버에 직접 저장되므로, 세션 내의 데이터를 탈취하는 것이 어렵다.
세션 통신 방법
- 클라이언트가 서버에 접속 시, 세션 ID를 발급한다.
- 서버에서는 클라이언트에게 발급해준 세션 ID를 클라이언트의 쿠키에 저장한다.
- 클라이언트가 다시 페이지에 접속할 때, 세션 ID가 담긴 쿠키를 HTTP Header에 담아 서버에 Request를 전송한다.
- 서버는 Request Header에 담긴 쿠키 정보(세션 ID)로 클라이언트를 판별한다.
- 세션 ID를 클라이언트와 주고 받을때, 주로 쿠키를 이용하는 경우가 많다.
세션 ID 보안의 취약점
- 관리자의 세션 ID를 탈취할 수 있으면
- 해당 사이트와 통신할 때, 쿠키의 세션 ID에 관리자의 세션 ID를 담을 수 있다.
- 즉, 관리자 권한으로 이용할 수 있다.
- 예방법
- 세션에 로그인 했을 때의 IP를 저장한다.
- 페이지 이동 시마다, 현재 IP와 세션의 IP/브라우저 정보(User Agent)가 같은지 검사한다.
사용 예시
쿠키 vs 세션
| 쿠키 | 세션 |
저장 위치 | 클라이언트 | 서버 |
보안 | 변질 우려로 인해 보안 취약 | 비교적 보안성이 좋다. |
라이프 사이클 | 만료 기간 지정, 브라우저 종료 시에도 유지 | 브라우저 종료시 삭제 (기간 지정이 가능하긴 하다.) |
속도 | 빠름 | 느림 (서버에 정보가 저장되어 있으므로) |
Cache (캐시)
정의
-
리소스 파일들의 임시 저장소이다.
-
client가 요청한 html, image, js, css 등의 첫 요청 시에 파일을 내려받아 특정 위치에 저장하고, 이후 동일한 URL의 Resource 요청시 해당 자료를 다시 내려받지 않고 내부에 저장한 파일을 사용하여 더 빠르게 제공한다.
이전에 사용되었던 데이터는 다시 사용될 가능성이 높다
- 그러므로, 다시 사용될 확률이 있는 데이터들을 빠르게 접근 가능한 저장소에 저장한다.
Cache Hit (캐시 히트)
- CPU가 참조하고자 하는 메모리가 Cache에 존재하고 있는 경우
Cache Miss (캐시 미스)
- CPU가 참조하고자 하는 메모리가 Cache에 존재하지 않은 경우