- [Network-Protocol] WebSocket?2023년 04월 10일
- 오렌지망고맛
- 작성자
- 2023.04.10.:03
순서
WebSocket의 특징
WS 이전의 통신방식
WS 동작과정
Socket.io
WebSocket이란?
: Server와 Clinet 간의 메시지 교환을 위한 통신 규약(Protocol)WebSocket의 특징
▶ 양방향 통신
- 데이터 송수신을 동시에 처리할 수 있는 방법
- 통상적인 HTTP 통신은 Client가 요청을 보낼때만 Server가 응답하는 방식이지만, WebSocket은 양방향 통신이 가능하다.
▶ 실시간 네트워킹
- Web 환경에서 연속된 데이터를 빠르게 노출하는 것.(채팅 및 주식 등등)
WS 이전의 통신방식
▶ Polling
- setTimeout, setInterval 등으로 일정 주기마다 Server에게 Request를 보내는 방법( != 실시간)
- HTTP 통신을 하기 때문에 Request/Response Header가 불필요하게 크다. → Server에게 부담을 준다.
- Polling 방식을 선택하는 경우
▷ 응답을 실시간으로 받지 않아도 되는 경우
▷ 다수의 사용자가 동시에 사용하는 경우
▷ facebook, chatting, messanger 등
▶ Long Polling
- Polling과 비슷하게 일정주기마다 Request를 보내지만 Server가 응답을 바로 전달하지 않고 특정 이벤트나 TimeOut이 발생했을 때 응답을 전달하는 방식
- 응답을 받은 Client는 다시 Server에게 데이터를 Request 한다.
- 불필요한 Request가 적기 때문에 Server 입장에서는 Polling 보다 낫다.
- Long Polling도 동시 다발적인 요청과 응답이 생기면 부하가 발생할 수 있다.
- HTTP 통신을 하기 때문에 Request/Response Header가 불필요하게 크다.
- Long Polling을 선택하는 경우
▷ 응답을 실시간으로 받아야 하는 경우
▷ 적은 수의 사용자가 동시에 사용하는 경우
▶ Streaming
- 이벤트가 발생했을 때 응답을 내려주나 응답을 완료시키지 않고 계속 연결을 유지하는 방식
- Long Polling에 비해 응답마다 다시 요청을 하지 않아도 되므로 효율적이지만, 연결 시간이 길어질수록 연결 유효성 관리의 부담이 발생할 수 있다.
- HTTP 통신을 하기 때문에 Request/Response Header가 불필요하게 크다.
WS 동작과정
Opening Handshake → Data transfer → Closing Handshake
▶ HandShake
Opening Handshake와 Closing Handshake는 일반적으로 TCP HTTP 통신의 과정 중 하나로, 접속 요청은 HTTP로 한 뒤, WS로 변경된다.
WebSocket Protocol로 변경되기 위한 HTTP Header는 다음과 같다.
<Request Header>
GET /chat HTTP/1.1 Host: localhost:8080 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: ???? Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: htp://localhost:9000※ 부가설명
"GET /chat HTTP/1.1"
: WebSocket 통신 요청은 GET으로 해야하고 HTTP 버전은 1.1 이상이어야 한다.
"Upgrade"
: Protocol을 전환하기 위한 Header로 WebSocket 요청 시에는 "websocket" 값을 가지며, 이 값이 없거나 다른 값이면 cross-protocol attack으로 간주하여 접속을 중지한다.
"Connection"
: 현재 전송이 완료된후 네트워크 접속을 유지할 것인가에 대한 정보로, WebSocket 요청 시에는 반드시 Upgrade라는 값을 가진다. 앞서 언급했던 Upgrade와 마찬가지로 이 값이 없거나 다른 값이면 WebSocket을 중지한다.
"Sec-WebSocket-Key"
: 유효한 요청인지 확인하기 위해 사용하는 키 값
"Sec-WebSocket-Protocol"
: 사용하고자 하는 하나 이상의 WebSocket Protocol 지정(필수X)
"Sec-WebSocket-Version"
: Client가 사용하고자 하는 WebSocket Protocol 버전
"Origin"
: CORS 정책으로 만들어진 헤더로, Cross-Site WebSocket Hijacking과 같은 공격을 피하기 위한 항목
<Response Header>
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: ???? Sec-WebSocket-Protocol: chat※ 부가설명
"HTTP/1.1 101 Switching Protocols"
: 101은 HTTP 응답코드로 WS로 Protocol 전환 승인 코드
"Sec-WebSocket-Accept"
: Request Header의 Sec-WebSocket에 Unique ID를 더해서 SHA-1로 해싱한 후 base64로 Encoding한 결과값. WS가 개시되었음을 알림
'NETWORK' 카테고리의 다른 글
[Network] "OSI" & "TCP/IP" (0) 2023.05.03 [Network-Protocol] "TCP" & "UDP" (1) 2023.05.02 [Network-Protocol] HTTP "GET" & "POST" (3) 2023.05.02 다음글이전글이전 글이 없습니다.댓글