1. 웹 소켓 업그레이드 요청

1 GET /ws HTTP/1.1 2 Host: server.example.com 3 Upgrade: websocket 4 Connection: Upgrade 5 Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== 6 Origin: http://localhost:8080 7 Sec-WebSocket-Protocol: ws 8 Sec-WebSocket-Version: 13




 |Upgrade|
- 반드시
 " websocket" 이라는 값을 가진다.
-
만약 이 값이 없거나 다른 값이면 cross-protocol attack 이라고 간주하고 WebSocket 접속과정을 중지한다.


 |Connection|
- 반드시
 "Upgrade " 라는 값을 가진다.

만약 이 값이 없거나 다른 값이면 cross-protocol attack 이라고 간주하고 WebSocket 접속과정을 중지한다.


|Host|
-
클라이언트가 WebSocket으로 접속을 시도하는 hostname. 만약 한 서버에서 여러 host를 서비스하고 있을 경우 각 host에 따라 다른 처리를 하기 위해 필요하다.

- 만약 이 값이 없거나 서버에서 서비스하고 있는 hostname이 아닐 경우 cross-protocol attack 이나 DNS rebiding attack 이라고 간주한다.


|Origin|
- WebSocket
접속을 요청한 페이지의 scheme, hostname, port(만약 기본포트가 아닐 경우에만 포함). WebSocket 서버에서 요청 페이지에 따라 다른 처리방식을 각각 결정하기 위해 필요한 정보이다.


|Sec-WebSocket-Protocol|

- 클라이언트가 요청하는 여러 서브프로토콜을 의미한다. 공백문자로 구분되며 순서에 따라 우선권이 부여된다. 서버에서 여러 프로토콜 혹은 프로토콜 버전을 나눠서 서비스할 경우 필요한 정보이다.


|Sec-WebSocket-Key1| |Sec-WebSocket-Key2|


- 서버의 handshake 를 위한 정보를 계산하기 위해 필요한 값이다

-  UUID 32byte 값을 Base64 인코딩을 통해 변환한다.

- 매직키로 불린다.





2. 웹 소켓 업그레이드 응답

1 HTTP/1.1 101 Switching Protocols 2 Upgrade: websocket 3 Connection: Upgrade 4 Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 5 Sec-WebSocket-Protocol: chat


- 요청에 성공하면 101 응답인 Switching Protocols 값을 받는다.

- 필수 요청 헤더 값(Upgrade, COnnection) 에 대한 정보를 리턴한다.


- Sec-WebSocket-Accept 에 요청 매직키를 포함하여 리턴한다.


Sec-WebSocket-Accept 검증 값 만들기  


1) Sec-WebSocket-Key 값 디코딩해서 검증한다.

2) GUID(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)를 붙여서 문자열을 만든다.

3) GUID가 붙은 Key를 SHA1 HASHING -> Binaray 형식으로 만든다.

4) Binary SHA1 Hashing 된 Key 값을 다시 Base64 Encoding 을 거친다.



자바 소켓으로 websocket 프로토콜 구현 테스트



WebSocket Framing Data




1. FIN : 1 bit , 뒤에 오는 데이터가 더 있는지 확인하기 위한 패킷.(긴데이터를쪼개서보낼때사용)


2. RSV : 3bit , 체크하지 않음


3. OPCODE : Frame의 종류, 2바이트


continue = 0x0
text = 0x1
binary = 0x2
close: 0x8
Ping: 0x9
Pong: 0xA


  1. MASK : 1bit, 클라이언트가 서버로 보낼때는 항상 1의 값.

  2. payload len :크기가 126보다 적으면 payload length가 값을 나타낸다.

    126 이면 뒤에 따라오는 16 bits가  값이고 length는 길이를 의미. 0 ~ 0xFFFF(65536) 값 가능.

    127 이상이면, 64 bits Payload data length. 0 ~ 0xFFFFFFFFFFFFFFFF

  3.  Masking-key : 4 bytes, MASK가 1값이면 표시하고 아니면 표시하지 않는다.

  4. Payload Data :  연결이 설정된 경우, 사용자 지정 확장 데이터가 포함





구축시 주의사항

  1. HOL Blocking (Head-of-Line Blocking)

- 네트워크 상황에서 같은 큐의 앞선 데이터의 지연이 발생한 경우
 ex) 하나의 데이터는 네트워크 상황에서 여러번 쪼개서 보내질 수 있는데, 앞서 보낸 데이터가 문제가 있을 경우 뒤에 있는 데이터는 지연이 발생 혹은 탈락할 요소가 있다.

- 회피 방법 : 패킷 계산(packet length), header 압축 등

 
   2. CORS (Cross Origin Resource Share)
- 웹 브라우저의 외부 도메인 서버와 통신하기 위한 스펙
- 회피 방법 : 클라이언트는 preflight 요청, 서버는 이에 따른 요청 허용 및 응답 헤더 추가









참조

https://adrenal.tistory.com/16

https://hpbn.co/websocket/
https://tools.ietf.org/html/rfc6455


'Architecture & Protocol' 카테고리의 다른 글

HTTP2 Protocol 분석  (0) 2019.04.16
12 요소 애플리케이션 방법론  (0) 2019.02.21
서비스 지향 아키텍쳐(SOA)  (0) 2018.12.30
마이크로서비스 아키텍처(MSA)  (0) 2018.12.02

+ Recent posts