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 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
-
MASK : 1bit, 클라이언트가 서버로 보낼때는 항상 1의 값.
-
payload len :크기가 126보다 적으면 payload length가 값을 나타낸다.
126 이면 뒤에 따라오는 16 bits가 값이고 length는 길이를 의미. 0 ~ 0xFFFF(65536) 값 가능.
127 이상이면, 64 bits 가 Payload data length. 0 ~ 0xFFFFFFFFFFFFFFFF
Masking-key : 4 bytes, MASK가 1값이면 표시하고 아니면 표시하지 않는다.
- Payload Data : 연결이 설정된 경우, 사용자 지정 확장 데이터가 포함
'Architecture & Protocol' 카테고리의 다른 글
HTTP2 Protocol 분석 (0) | 2019.04.16 |
---|---|
12 요소 애플리케이션 방법론 (0) | 2019.02.21 |
서비스 지향 아키텍쳐(SOA) (0) | 2018.12.30 |
마이크로서비스 아키텍처(MSA) (0) | 2018.12.02 |