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



TCP Packet(Segment) 




1)  Sourse/Destination Port Number ( 16 비트)             


 - 데이터를 생성한 애플리케이션에서 사용하는 포트번호

 - 목적지 애플리케이션에서 사용하는 포트번호



2) Sequence number (32 비트)             


 - 전송되는 데이터의 가상 회선을 통해 데이터의 모든 바이트에는 고유한 일련번호가 부여된다.

 - 네트워크가 불안하여 패킷을 분실, 지연 등으로 세그먼트가 순서가 어긋나게 도착 할 수 있기 때문에 sequence number를 이용하여 데이터를 올바른 순서로 재배열 할 수 있다.



3) acknowledgement number (32 비트)             


- 수신하기를 기다리는 다음 바이트 번호 

- 마지막 수신성공 번호 +1 .. 순서로 할당



4) HLEN = Header Length (4 비트)             


헤드의 길이를 32비트 단위로 나타낸다. 최소 필드 값은 5 (5 * 32 = 160bit or 20Byte )  최대 값 15 (15 * 32 = 480bit or 60byte)


5) 예약 (6 비트)             


- 추후 사용을 위한 예약된 필드


6)  Flag Bits 


- 6개의 플래그 비트

TCP 세그먼트 전달과 관련되어 TCP 회선 및 데이터 관리 제어 기능을 하는 플래그


CWR :(Congestion Window Reduced) – 혼잡 윈도우 크기 감소

- ECN :(Explicit Congestion Notification) – 혼잡을 알림

- URG(Urgent) : Urgent Pointer 필드가 가리키는 세그먼트 번호까지 긴급 데이터를 포함되어 있다는 것을 뜻한다.

  이 플래그가 설정되지 않았다면 Uregent Pointer 필드는 무시되어야 한다.

- ACK(Acknowledgment) : 확인 응답 메시지

- PSH(Push) : 데이터를 포함한다는 것을 뜻한다.

- RST(Reset) : 수신 거부를 하고자 할때 사용

- SYN(Synchronize) : 가상 회선이 처음 개설될 때 두 시스템의 TCP 소프트웨어는 의미 있는 확인 메시지를 전송하기 위해  일련 번호를서로 동기화해야 한다.

- FIN(Finish) : 작업이 끝나고 가상 회선을 종결하고자 할 때 사용



7)  Windows Size(16 비트)


- 흐름제어를 위해 사용하는 필드



8)  CheckSum (16 비트)


TCP 세그먼트의 내용이 유효한지 검증하고 손상 여부를 검사 할 수 있다.





9)  Urgent Pointer (16 비트)


- TCP 세그먼트에 포함된 긴급 데이터에 대한 마지막 바이트에 대한 일련번호

 현재 일련번호(sequence number)로부터 긴급 데이터까지의  바이트 오프셋(offset)
        . 해당 세그먼트의 일련번호에 urgent point 값을 더해 긴급 데이터의 끝을 알수있음







참고자료: http://www.ktword.co.kr/abbr_view.php?m_temp1=1889

+ Recent posts