Connectionless, Stateless
Server의 자원은 한정되어있으므로 server-client의 접속을 계속 유지하지는 않는다.
따라서 서버는 클라이언트의 요청에 응답한 후 연결을 지속하지 않고 끊는다.
연결(Connection)을 유지하지 않고 끊기 때문에 connectionless라 한다.
서버는 클라이언트의 정보(state)도 저장하지 않는다.
만약 클라이언트의 정보를 서버에서 관리한다면 무조건 해당 클라이언트는 해당 서버와 통신이 이루어져야 하기 때문이다.
이는 서버의 증설(scale-out)/관리를 어렵게한다.
이러한 특성을 stateless라 한다.
Cookie, Session의 필요성
클라이언트의 로그인 정보나 특정 상태를 저장하고 유지해야할 때가 있다.
그런데 서버가 클라이언트의 정보를 저장하지 않는 stateless 특성 때문에 서버에서 관리하기는 어렵다.
이러한 문제를 쿠키나 세션을 통해 해결할 수 있다.
Cookie (쿠키)
클라이언트의 컴퓨터에 저장되는 임시 데이터이다.
동작 방식
- Server → Client : <pre>set-cookie</pre> : "정보를 저장해!"
- Client → Server : <pre>cookie = {data}</pre> : 정보 전달
주요 특징
- Client는 server에게 요청을 보낼 때 마다 모든 정보를 보낸다.
- 그래서 최소한의 정보만 cookie에 저장해야 한다.
- 만료 날짜/시간을 지정할 수 있다.
- 특별히 지정하지 않으면 브라우저가 종료될 때 까지 저장된다.
- 각 브라우저별로 별도로 저장되므로 다른 브라우저에서는 사용할 수 없다.
단점
- 성능 저하의 원인이 될 수 있다.
- 모든 요청마다 모든 정보가 함께 전송되기 때문에 성능 저하를 야기할 수 있다.
- 쿠키는 보안에 매우 취약하다.
- 쿠키의 값은 임의로 변경될 수 있다.
- 쿠키에 저장된 값은 탈취될 수 있다.
- 쿠키는 한 번만 탈취하면 계속해서 사용할 수 있다.
Session (세션)
예측 불가능하고 복잡한 session ID를 사용함으로써 쿠키의 문제를 해결한다.
동작 방식
- 서버는 클라이언트에 session ID을 할당하고 그 정보를 session에 저장한다.
- 클라이언트는 session ID를 쿠키를 통해 저장한다.
- 클라이언트에서 요청이 들어올 때 서버는 쿠키 속의 session ID와 session의 정보를 비교해서 사용자를 확인한다.
특징
- 보안성
- 해석할 수 없는 정보이기 때문에 탈취되어도 사용자의 정보를 유출할 수 없다.
- 다만, 쿠키에 들어있는 정보를 탈취하면 같은 리소스에 대해 접근이 가능하다.
- 서버는 세션의 만료시간을 짧게하여 이런 문제를 해결한다.
- 메모리 정리
- 세션의 내용은 서버의 메모리에 저장되기 때문에 최소한의 데이터만 담는 것이 좋다.
- 필요 없어진 내용이나 세션은 바로바로 제거하는 것이 좋다.
- 특히 로그인 데이터의 경우 로그아웃을 하지 않는 사용자가 많기 때문에 </pre>Max inactive interval</pre>(세션 유효시간)을 지정하는 것이 좋다.
- 브라우저 호환 X
- 쿠키를 이용해서 세션 id를 비교하므로 다른 브라우저에서는 사용할 수 없다.
참고
'Coding > [Web] Backend' 카테고리의 다른 글
[SpringBoot] @Builder의 장점 (3) | 2024.01.14 |
---|---|
Singleton Pattern (1) | 2023.04.04 |
Entity, DTO, DAO, VO (0) | 2023.04.03 |
MVC 패턴 (feat. Servlet/JSP) (0) | 2023.04.03 |
PRG 패턴 : Post → Redirect → Get (0) | 2023.04.03 |
댓글