쿠키(Cookie)와 세션(Session)
쿠키와 세션을 왜 사용하나요?
HTTP 통신의 문제점 때문에 !
HTTP 통신
HTTP 통신 방법
- HTTP는 서버와 client간의 요청과 응답으로 데이터를 주고 받는다.
- 서버는 client의 요청에 응답하면 연결을 끊는다.
- client는 서버에 또 다른 요청을 하려면 새로 연결하여 응답을 받아야 한다.
HTTP 통신 특징
1. Connectionless (비연결성)
- HTTP는 TCP 연결을 맺고 요청(Request)를 보내면 서버는 응답(Response)를 보내고 연결이 끊어진다.
- HTTP는 요청할 때 잠깐, 응답할 때 잠깐 연결하는 비연결성의 특징 (계속 연결된 상태가 아니다.)
- HTTP 1.1 버전은 connection을 계속 유지하는 keep-alive 설정이 디폴트이나, HTTP 1.0 버전은 connectionless 이다.
2. Stateless (무상태)
- 서블릿 컨테이너 내에 여러 개의 서블릿이 있는데, 각각의 서블릿에서 상태값(속성, 변수값)을 다른 서블릿에서 공유해서 쓸 수 없다.
- HTTP는 상태를 따로 저장하지 않아서, 연결이 끊어지는 순간 모든 상태 정보가 사라지게 된다.
HTTP 통신 문제점
- 유지되어야 하는 정보가 연결이 끊어지면서 사라지는 문제가 발생한다.
- 예 : 로그인 후의 로그인 정보, 장바구니에 넣은 데이터 등
연결이 끊어진 후에도 client의 정보를 '유지'하기 위해서 사용하는 것이 쿠키와 세션이다.
쿠키 (Cookie)
쿠키(Cookie)란?
- 클라이언트 로컬(사용자 컴퓨터)에 데이터를 저장하는 기술로, 필요 시에 저장한 데이터를 서버와 공유하여 정보를 유지한다.
- 데이터를 Map 형식으로 저장하고, 데이터의 크기와 개수에 제한이 없다.
- 쿠키 유지 시간, 유효 디렉토리, 유효 도메인 등을 설정할 수 있다.
- 클라이언트에 300개까지 쿠키를 저장할 수 있고, 하나의 도메인 당 20개의 값만 가질 수 있으며, 하나의 쿠키 값은 4KB까지이다.
- Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있다.
- 간단하게 이용할 수 있다는 장점이 있으나, 공용 PC를 사용하거나 url에 일부 데이터를 포함하는 경우 보안에 취약하다
- 패키지 : javax.servlet.http.Cookie
쿠키의 속성
- namve = value
ASCII 문자만 사용 가능하며, 한 번 설정된 쿠키의 이름은 수정될 수 없다.
- expire = '날짜'
쿠키의 유지시간, 설정이 따로 없으면 브라우저 동작 동안 유지한다.
- paht = '경로'
쿠키가 전달되는 서버의 유효 디렉토리를 지정하는 속성이다.
- domain = '서버정보'
쿠키가 전달되는 유효 서버를 설정한다.
- secure
Https나 ssl 보안 프로토콜로 요청할 때만 서버에 전송한다.
쿠키의 동작 순서
- 클라이언트가 페이지를 요청
- 서버에서 쿠키를 생성
- HTTP 헤더에 쿠키를 포함 시켜 응답
- 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관
- 같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄
- 서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 때, 쿠키를 업데이트하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답
쿠키 활용
- 방문했던 사이트에 다시 방문하였을 때 아이디와 비밀번호 자동 입력
- 팝업창을 통해 "오늘 이 창을 다시 보지 않기" 체크
세션(Session)
세션(Session)이란?
- 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장한다.
- client에 Session ID(고유)를 부여하고 client가 request로 Session ID를 보내면 ID가 일치하는 Session 정보를 컨테이너가 생성하여 그 객체의 데이터를 사용한다.
- 브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제가 되기 때문에 쿠키보다 비교적 보안이 좋다.
- 저장 데이터에 제한이 없다.
- 사용자가 맣아질수록 서버 메모리를 많이 차지하게 된다.
- 동시 접속자가 많은 웹의 경우 서버에 과부화를 주게될 수 있고, 성능 저하의 요인이 될 수 있다.
- 패키지 : javax.servlet.http.HttpSession
세션의 동작 순서
- 클라이언트가 페이지를 요청한다.
- 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인하여, 클라이언트가 해당 Session-id를 보냈는지 확인한다.
- Session-id가 존재하지 않는다면, 서버는 Session-id를 생성해 클라이언트에게 돌려준다.
- 서버에서 클라이언트로 돌려준 Session-id를 쿠키를 사용해 서버에 저장한다
- 클라이언트는 재접속시 이 쿠키를 이용하여 Session-id 값을 서버에 전달한다.
- 해당 Session-id를 전달 받아서 세션에 있는 클라이언트 정보를 가져와서 사용한다.
세션 사용 예시
- 로그인처럼 보안상 중요한 작업을 수행할 때 사용
- 화면이 이동해도 로그인이 풀리지 않고 로그아웃을 하기 전까지 유지할 때
쿠키와 세션의 차이
- 쿠키는 클라이언트에 저장, 세션은 서버에 저장
- 보안 면에서는 세션이 더 우수 (세션은 쿠키를 이용해 쿠키에 Session ID만 저장하고 서버에 세션을 처리하기 때문)
- 쿠키는 만료시간 동안 파일로 저장 (브라우저를 종료해도 정보가 남아있음)
- 세션은 브라우저가 종료되면 만료시간에 상관없이 삭제
- 쿠키와 세션 중, 쿠키의 속도가 더 빠름
쿠키와 세션을 나누어서 사용하는 이유
세션은 서버에 저장되므로 서버의 자원을 사용하고, 쿠키는 클라이언트에 저장되므로 서버의 자원 사용하지 않는다.
세션을 무분별하게 만들다보면 서버의 메모리에 부하가 걸릴 수 있으며, 이에 다라 속도가 느려질 수 있기 때문이다.