웹 소켓 (Web Socket)
두 프로그램 간의 메세지를 교환하기 위한 통신 방법 중 하나.
웹 소켓의 특징
양방향 통신(Full-Duplex)
- 데이터 송수신을 동시에 처리할 수 있는 통신
- 클라이언트와 서버가 서로에게 원할 때 데이터를 주고 받을 수 있음
- 통상적인 http 통신은 client가 요청을 보내는 경우에만 Server가 응답하는 단방향 통신
실시간 네트워킹(Real Time-Networking)
- 웹 환경에서 연속된 데이터를 빠르게 노출
- 채팅, 주식, 비디오 데이터
- 여러 단말기에 빠르게 데이터를 교환
웹 소켓 이전에 비슷한 기술
1. Polling
서버로 일정 주기 요청 송신
2. Real-time
- 통신에서는 언제 통신이 발생할지 예측이 불가능
- 불필요한 request와 connection을 생성
3. Real-time
- 통신이라고 부르기 애매할 정도의 실시간성
4. Long Polling
- 서버에 요청 보내고 이벤트가 생겨 응답 받을때까지 연결 종료X
- 응답 받으면 끊고 다시 재요청
5. Streaming
- 서버에 요청 보내고 끊기지 않은 연결상태에서 끊임없이 데이터 수신
- 클라이언트에서 서버로의 데이터 송신이 어렵다.
1. 웹 소켓 요청(Request) 시 동작 방법 - 핸드 쉐이킹
http(80) or https(443) → http(80) or https(443)
[1. GET / chat HTTP/1.1]
반드시 Get Method를 사용해야 하고, HTTP 버전은 1.1이상
[2. Host : server.example.com]
- 웹소켓 서버의 주소
[3. Upgrade : websocket]
- 현재 클라이언트, 서버, 전송 프로토콜 연결에서 다른 프로토콜로 업그레이드 또는 변경하기 위한 규칙
[4. Connection : Upgrade]
- Upgrade 헤더 필드가 명시되었을 경우, 송신자는 반드시 Upgrade 옵션을 지정한 Connection 헤더 필드도 전송
[5. Sec-WebSocket-Key : dGhllHNgnXBSZSBub25jZQ ==]
- 클라이언트와 서버간의 신원을 인증한다.
[6. Origin : http //example.com]
- 클라이언트로 웹 브라우저를 사용하는 경우에 필수항목, 클라이언트 주소
[7. Sec-WebSocket-Protocol : chat, superchat]
- 클라이언트가 요청하는 여러 서브프로토콜을 의미
- 공백문자를 구분하며 순서에 따라 우선권 부여
- 서버에서 여러 프로토콜 혹은 프로토콜 버전을 나워 서비스할 경우 필요한 정보
[8. Sec-WebSocket-Version: 13]
2. 웹 소켓 응답(Response) 시 동작 방법- 핸드 쉐이킹
(1) 101 Switching Protocols가 Response로 오면 웹소켓이 연결 ← HTTP/1.1 101 switching Protocols
(2) 클라이언트로부터 받은 Sec-WebSocket-Key를 사용하여 계산된 값
(클라이언트에서 계산한 값과 일치하지 않은 경우 연결 수립X)
↑ Sec-WebSocket-Key : s3pPLMBiTxaQ9kYGzzhZRbk+xOo
3. 웹 소켓 동작 방법 - 프레임
프레임 헤더 구조
opCode(operate Code)
Continue(0x0) : 전체 메세지의 일부임을 의미
- Text(0x1) : 포함된 데이터가 UTF-8 텍스트라는 것을 의미
- Binary(0x2) : 포함된 데이터가 이진 데이터라는 의미
- close(0x8) : Close 핸드쉐이크를 시작한다는 의미
Length : 이 프레임에 포함된 데이터의 총 길이를 나타내는 단위
4. 웹 소켓 동작 방법 - 데이터 전송
Close Frame을 주고 받으면 연결 종료
5. 정리
브라우저가 웹서버에게 websocket 사용 가능 여부 확인 (with. magic key)
- 웹서버에서 브라우저에 웹 소켓 준비됐다고 하고 연결 시작.
- 0x00과 0xff 사이에 utf-8로 인코딩된 payload를 사이에 넣어서 데이터를 교환.
- 연결 종료 신호를 주고 받아서 연결 종료.
6. 웹 소켓 프로토콜 특징
- 최초 접속에서만 http 프로토콜 위에서 handshaking을 하기 때문에 http header를 사용한다.
웹소켓을 위한 별도의 포트는 없으며, 기존 포트(http-80, https-443)을 사용.
- 프레임으로 구성된 메세지라는 논리적 단위로 송수신.
- 메시지에 포함될 수 있는 교환 가능한 메세지는 텍스트와 바이너리
'우아한 테크톡' 카테고리의 다른 글
CI/CD와 무중단 배포 (0) | 2023.01.13 |
---|---|
Servlet vs Spring (0) | 2023.01.12 |
AOP와 Spring AOP (0) | 2023.01.11 |
Spring과 Spring Boot의 차이 (0) | 2023.01.11 |
JVM Stack & Heap (0) | 2023.01.10 |
댓글