[CODING] WebSocket - Overview , Protocol/API and Security

WebSocket이란?

WebSocket은 웹 페이지에서 실시간으로 동작하는 웹 서비스를 만들어 줄 수 있는 표준 기술입니다. 일반적으로 웹 프로토콜인 HTTP는 Request와 Response 기반으로 새로 요청이 발생하면 페이지를 다시 그려야하는 구조입니다. 덕분에 쿠키라는 개념도 사용되게 되었지요. (인증 정보를 유지하기 위해)

저 또한 페이지의 이동없이 나름 동적으로 동작하는 웹 페이지를 만들기 위해서 iframe을 이용하여 트릭을 좀 쓰곤 합니다. 이처럼 사용자는 페이지의 이동 없이 내부 동작을 처리하고 싶어집니다. 웹을 일반 응용프로그램과 비슷한 여건을 만들어주는 WebSocket이 사용되게 되었고, 이는 HTML5의 표준으로 올라가게 되었습니다.

이를 통해서 웹은 좀 더 편리하게 실시간으로 데이터를 갱신할 수 있게되지요.

WebSocket은 Upgrade 헤더를 통해 일반 웹 페이지에서 웹 소켓으로 전환할 수 있습니다. 아래를 보시면 Upgrade 헤더와 connect 헤더에 각각 WebSocket, Upgrade가 들어가있는 것을 볼 수 있습니다.


GET /... HTTP/1.1 
Upgrade: WebSocket 
Connection: Upgrade 

이는 HTTP 기반 웹 처리에서 WebSocket 으로 넘어가게 하는 구절이며 이와 동시에 클라이언트가 랜덤한 키 값을 서버로 보내어 토큰을 생성하고 반환하는 과정, 즉 Handshaking이 이루어집니다.

Wikipidia에 있는 예제를 보면 아래와 같습니다.

Request


GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==         --> BASE64(Random Byte)
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

Response


HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=   --> BASE64(SHA1(GUID)
Sec-WebSocket-Protocol: chat

여기서 Sec-WebSocket-Key와 Sec-WebSocket-Accept 부분은 개인정보 보호 및 무결성 검증을 위해서 사용되는 부분이고 아래와 같이 각각 값들을 Base 64로 인코딩하여 사용합니다.

Sec-WebSocket-Key: 랜덤한 Byte를 Base64로 인코딩 Sec-WebSocket-Accept: GUID 값을 Sha1으로 해싱 후 Base64로 인코딩

WebSocket Protocol & API

위에서 WebSocket Protocol에 대한 이야기를 어느정도 해두어서 간단하게 하겠습니다. 일단 ws:// 를 통해 WebSocket 프로토콜을 사용할 수 있습니다. SSL 적용은 https과 같이 wss로 동작합니다.

웹 소켓 연결 주소 ws://127.0.0.1:80

WebSocket을 사용하는 간단한 코드입니다.


if (true)
{ 
    var TestSocket = new WebSocket(“ws://127.0.0.1:80”);
    // localhost의 80 포트로 WebSocket을 연결합니다.

    TestSocket.send(“Msg!!”);
    // 메시지를 전송합니다
   
    TestSocket.close();
    // Socket 종료
}

127.0.0.1에 연결 후Msg!!를 전송하고 Socket을 닫는 코드이지요. WebSocket 함수들은 구글링해보시면 많이 나옵니다. (https://html.spec.whatwg.org 참고)

WebSocket Security

가장 크게 우려되는 부분이 https를 사용하는 페이지에서 WebSocket을 사용할 때 SSL이 적용되지 않은 소켓을 사용하는 것 입니다. 이러한 형태의 실수는 자주 발생할 수 있는 부분이고 WebSocket을 통해 전송되는 데이터가 중요한 데이터라면 그 의미는 더욱 커지기 마련입니다.

또한 WebSocket을 이용한 공격또한 은근히 보입니다. CSWSH(Cross-Site WebSocket Hijacking) 등등 웹 기반에서 발생할 수 있는 취약점의 응용 선상도 존재합니다. CSWSH도 결국 CORS헤더에서 요청의 신원에 대해 제어하지 않을 때 다른 서버로 Cookie 값을 넘길 수 있기 때문에 WebSocket을 통해 HTTP 통신을 하는 웹 페이지까지 공격 당할 수도 있지요.

## https://html.spec.whatwg.org/multipage/comms.html#network http://d2.naver.com/helloworld/1336 https://developer.mozilla.org/ko/docs/WebSockets/Writing_WebSocket_client_applications https://en.wikipedia.org/wiki/WebSocket