Stateless와 Connectionless
무상태(Stateless)와 비연결성(Connectionless)은 HTTP의 특징 중 하나이다.
Stateless
* stateful : 서버가 클라이언트의 이전 상태를 보존 (상태유지)
* stateless : 서버가 클라이언트의 이전 상태를 보존하지 않음 (무상태)
* stateless의 예시 : HTTP
* stateful의 예시 : TCP
Stateful의 문제점
- 해당 서버가 멈추거나 사용이 불가시, 다른 서버 사용이 어려움
- 새로운 서버에는 이전 서버의 데이터가 존재하지 않음
- 한 서버가 처리할 수 있는 능력보다 많은 요청 발생 시 처리 한계
- Scale-in을 하는 경우 하나의 서버에 트래픽이 몰리거나 기존의 트래픽의 데이터가 유실 될 수 있다.
개념
- 클라이언트 서버 사이에 상태를 유지하지 않음
- 서버는 단순히 요청에 대한 응답을 보내며, 상태 관리는 클라이언트에게 책임
- 통신에 필요한 모든 상태 정보들은 클라이언트에서 가지고 있다가 서버와 통신할때 데이터를 실어 보냄
특징
- 동일한 요청이라도 매번 각 요청은 독립적
- HTTP에서 stateless하다는 건 서버입장에서 클라이언트의 상태가 없다는 의미
- 요청에 대한 응답을 처리하게 되면 연결이 끊어져(Connectionless) 이전 정보나 현재 통신 상태가 남아있지 않음(Stateless)
- 서버는 단순히 응답만 진행하므로 상태 유지에 대한 부하가 줄어듦
장점
- 높은 서버 확장성(Scale Out)
- 어떤 서버가 클라이언트 요청에 응답해도 상관 없음
- 서버 증설하여 문제가 생길 경우 다른 서버로 확장 가능
- 대용량 트래픽 발생 시 서버 확장을 통한 대처 수월함
단점
- 클라이언트가 추가 데이터를 매번 전송해야함
- ex) 로그인 상태를 유지해야하는 서비스의 경우 Token을 항상 Header에 유지해줘야 함.
- 빈번한 커넥션으로 인한 리소스 비용 발생
토큰
-
수행 내용
- 클라이언트가 서버 접속 시 서버에서 해당 클라이언트에게 인증의 의미로
토큰
부여 - 토큰을 발급받은 클라이언트는 또 다시 서버에 요청을 보낼 때
요청 헤더
에 토큰을 심어 보냄 - 서버는
받은 토큰
을제공한 토큰
과 일치여부를 체크하여 인증 과정 처리
- 클라이언트가 서버 접속 시 서버에서 해당 클라이언트에게 인증의 의미로
-
특징
- 토큰은 세션과 달리 서버가 아닌 클라이언트에 저장
- 세션을 관리하던 서버의 부담을 덜 수 있음
- 상태를 유지하지 않으므로 Stateless 함
- 토큰은 세션과 달리 서버가 아닌 클라이언트에 저장
-
단점
- 쿠키 세션과 달리 토큰 자체의 데이터 길이가 길어, 인증 요청이 많아질수록 네트워크 부하 심해질 수 있음
- payload자체는 암호화되지 않기에 중요한 정보는 담을 수 없음
- 토큰 탈취 시 대처 어려움
- 사용 기간 제한을 설정하여 극복
Connectionless
배경
- TCP/IP의 경우 기본적으로 연결을 종료하지 않으면 연결 유지
- 사용하지 않는 연결들은 서버의 자원낭비로 이어짐
- 이때문에 HTTP의 초기모델은 각 클라이언트가 서버에 요청을 하고 응답을 받으면 바로 TCP/IP 연결을 끊음 (
Connectionless
)
개념
- TCP/IP 커넥션 연결을 지속하지 않는다
장점
- 서버 자원의 효율적 사용
- 연결을 유지할 경우, 서버는 요청•응답이 끝난 관계여도 서버 자원 지속적 소모
- 같은 시간 대용량 트래픽 발생하는 일이 흔하지 않음
- 실제로 수천명이 하나의 서비스를 사용하더라도 동시 처리 요청은 수십개 이하로 매우작음
- 초단위의 빠른 속도로 요청•응답이 이루어짐
같은 시간 대용량 트래픽 발생 시, 대기열 서버 등을 이용
한계
- TCP/IP 연결을 새로 맺어야함
- 웹 브라우저로 사이트 요청 시, 수많은 자원 함께 다운로드
두 경우 모두 3way-handshake 시간이 걸림
한계 극복
- Persistent Connections (HTTP 지속 연결) 이용
- HTTP/2, HTTP/3 (opens in a new tab)에서 더욱 최적화
Persistent Connections (HTTP 지속 연결)
-
등장배경
- Connectionless는 불필요하게 많은 3way-handshake의 횟수를 줄이기 위해 등장
-
개념
- 서버와 클라이언트 중 하나가 명시적으로 connection을 close하거나 정책적으로 close 될 때까지 계속 connection을 유지하는 경우
- 요청•응답과정이 HTML 한페이지를 다 받을때 까지 지속된 이후 종료
-
장점
- 네트워크 혼잡 감소
TCP connection request
수가 줄어듦
- 네트워크 비용 감소
- 한 개의 connection으로 클라이언트 요청을 serving
- 지연시간 감소
- 3wy-handshake를 맺으며 필요한 round-trip이 줄어듦
- 네트워크 혼잡 감소
-
특징
- 기본적으로 웹 서버에서 Persistent Connections 적용해줌
- 연결 지속시간은 서버쪽에서 설정 가능 (요즘은 따로 설정해줄 필요X)
- 기본적으로 비연결성이지만, 성능 최적화를 위해 약간의 연결을 유지하는(연결성) 특성을 가짐
keep alive
개념
- HTTP와 TCP에서 Persistent Connections을 유지하기 위해 제공되는 옵션
- 클라이언트의 요청 처리 후 연결을 바로 끊지 않고 일정 시간 대기하는 시간
- 하나의 연결을 여러번 재사용하여 응답과 요청 수행 가능
HTTP keep-alive 옵션
- 사용
- HTTP/1.0+
- HTTP/1.0+ 부터 keep alive 옵션 추가
- HTTP 요청 헤더에
Connection: keep-alive
포함
- HTTP/1.1
- 기본적으로 모든 connection이 keep-alive 상태로, 하나의 TCP연결 위에서 이뤄짐
- HTTP/1.0과의 호환성을 위해
Connection: keep-alive
request를 받으면keep-alive
를 사용해 response 보냄
- HTTP/1.0+
TCP keep alive
- 사용이유
- 유령세션 구분
유령세션
: 연결된 두 호스트 중 한쪽 호스트 연결이 끊어져있는데도 연결이 된 줄 알고 계속 살아있는 세션
- 네트워크 비활성화로 인한 연결 해제 방지
- 유령세션 구분
- 사용
- TCP연결 종료 시 4way-handshake로 종료되는 것은 이상적인 상황
- keep-alive는 일정시간 간격으로 payload가 없는 데이터를 전송해 커넥션 생존유무 확인
- 살아있을 경우(ack 수신) 설정된 시간만큼 TCP세션 연장
- 죽어있을 경우(ack 수신X) TCP세션 종료
setsockopt()
를 통해 소켓에 keep-alive 옵션 지정