HTTP 프로토콜 환경에서 서버는 클라이언트와 통신할 때마다 클라이언트가 누구인지 확인해야 한다.
그 이유는 HTTP 프로토콜은 connectionless, stateless한 특성이 있기 때문이다.
클라이언트가 요청을 한 후 응답을 받으면 연결을 끊어버리는 특징
HTTP는 먼저 클라이언트가 서버에 request를 보내면, 서버는 요청에 맞는 response를 보내고 접속을 끊는다.
지속적인 연결로 인한 자원낭비를 줄이기 위해 이러한 특징들을 갖지만, 사용자의 접근성이 매우 떨어지는 요인이 된다.
쿠키와 세션을 사용함으로써 서버는 사용자에 대한 인증을 유지할 수 있어 HTTP의 특징을 해결할 수 있다.
클라이언트(브라우저) 측에서 관리되는 작은 데이터 파일
사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저 종료 후에도 인증이 유지된다.
쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 참조한다.
클라이언트에 최대 300개의 쿠키를 저장할 수 있으며, 하나의 도메인당 20개의 값만 가질 수 있다. 하나의 쿠키는 4KB까지 저장한다.
Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있다.
브라우저가 알아서 request시에 Request Header에 쿠키를 넣어 서버에 전송한다.
서버 측에서 관리하는 쿠키 기반의 데이터 파일
클라이언트를 구분하기 위해 서버의 엔진이 클라이언트에게 고유한 세션 ID를 부여하며 브라우저를 종료할 때까지 인증을 유지한다. 이때, 접속 시간에 제한을 두어 일정 시간 응답이 없다면 세션을 끊도록 설정할 수 있다.
사용자 인증 정보를 서버에 저장하기 때문에 보안에 좋다. 하지만, 사용자가 많아질수록 서버 메모리를 많이 차지한다. 동시접속자가 많을 경우 서버 과부하로 인한 성능 저하의 요인이 된다.
1. 클라이언트가 서버에 접속시 고유 세션 ID를 부여 받음
2. 클라이언트는 부여받은 세션 ID를 JSESSIONID라는 이름의 쿠키로 저장
3. 서버에 요청시 이 쿠키의 세션 ID를 서버에 전달
4. 서버는 전달받은 세션 ID로 세션에 있는 클라이언트 정보를 가져옴
5. 클라이언트 정보를 가지고 요청을 처리하여 클라이언트에게 응답
쿠키 | 세션 | |
---|---|---|
타입(Java) | javax.servlet.http.HttpSession (Interface) | javax.servlet.http.Cookie (Class) |
저장위치 | Client | Server |
저장형식 | File(String) | Object |
보안 | ✔️ | |
속도 | ✔️ | |
만료시점 | 쿠키 저장시 설정 (기본적으로 브라우저 종료 시) | 브라우저 종료 시 |
크기 | 한 도메인 당 20개, 4KB | 제한 없음 |
[참고]