웹 소켓 통신 | 오늘의 테크용어 : 웹소켓이 뭐냐면 모든 답변

당신은 주제를 찾고 있습니까 “웹 소켓 통신 – 오늘의 테크용어 : 웹소켓이 뭐냐면“? 다음 카테고리의 웹사이트 ppa.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.maxfit.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 코딩애플 이(가) 작성한 기사에는 조회수 45,242회 및 좋아요 1,310개 개의 좋아요가 있습니다.

웹 소켓 통신 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 오늘의 테크용어 : 웹소켓이 뭐냐면 – 웹 소켓 통신 주제에 대한 세부정보를 참조하세요

이걸로 메타버스 만들든가 하셈

친절한 코딩강의 https://codingapple.com
구독자용 10%할인 코드 YT123

웹 소켓 통신 주제에 대한 자세한 내용은 여기를 참조하세요.

웹 소켓 통신 (Web Socket) – Joker

웹 소켓(Web Socket)은 두 프로그램간의 메시지를 교환하기 위한 통신방법 중 하나입니다. 웹 소켓은 W3C와 IETF에 의해 자리잡은 표준 프로토콜 중 하나 …

+ 여기에 자세히 보기

Source: caileb.tistory.com

Date Published: 9/2/2021

View: 385

[네트워크, Network]3. WebSocket, 웹 소켓에 대해서 – velog

웹 소켓은 단순한 API로 구성되어 있어, 서버와 클라이언트 간에 Socket Connection을 유지해서 언제든 양방향 통신 또는 데이터 전송이 가능하도록 하는 …

+ 여기에 자세히 보기

Source: velog.io

Date Published: 12/17/2021

View: 5004

Http통신 vs Socket통신 (WebSocket) – 데엔잘하고싶은데엔

Http통신 vs Socket통신 (WebSocket) · Client의 요청이 있을때만, 서버가 응답해서 정보를 전송하고, 곧바로 연결을 끊는 방식 · 즉, Client가 요청을 …

+ 여기에 보기

Source: pearlluck.tistory.com

Date Published: 10/18/2021

View: 1104

웹소켓 – 모던 JavaScript 튜토리얼

이에 서버가 ‘네’라는 응답을 하면 서버-브라우저간 통신은 HTTP가 아닌 웹소켓 프로토콜을 사용해 진행됩니다. 이번엔 new WebSocket(“wss://javascript.

+ 자세한 내용은 여기를 클릭하십시오

Source: ko.javascript.info

Date Published: 3/15/2022

View: 3058

웹소켓 – 위키백과, 우리 모두의 백과사전

웹소켓(WebSocket)은 하나의 TCP 접속에 전이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜이다. 웹소켓 프로토콜은 2011년 IETF에 의해 RFC 6455로 표준화되었으며 …

+ 여기에 보기

Source: ko.wikipedia.org

Date Published: 6/4/2022

View: 5838

[WEB] 웹 소켓 (Socket) 정리 (역사부터 차근차근)

웹소켓은 HTML5 표준 기술로, 사용자의 브라우저와 서버 사이의 동적인 양방향 연결 채널을 구성합니다. Websocket API를 …

+ 자세한 내용은 여기를 클릭하십시오

Source: inpa.tistory.com

Date Published: 5/19/2022

View: 433

HTTP 통신과 Socket 통신의 차이점 – Kotlin World

HTTP란 HyperText Transfer Protocol의 약자로 HTML 파일을 전송하는 프로토콜이라는 의미를 가진다. 웹브라우저에서 통신이 일어나며, 초기에는 HTML …

+ 여기를 클릭

Source: kotlinworld.com

Date Published: 11/16/2022

View: 3879

WebSocket을 이용하여 클라이언트 애플리케이션 작성하기

일반적인 웹소켓 클라이언트는 사용자의 브라우저일 것이지만, … WebSocket 프로토콜을 사용하여 통신하기 위해서는 WebSocket 객체를 생성해야 …

+ 여기에 자세히 보기

Source: developer.mozilla.org

Date Published: 5/9/2022

View: 8881

웹 소켓(WebSocket) 개념 이해 – 유아마루

웹 소켓은 TCP 연결에 완전한 이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜입니다. 웹 소켓 프로토콜은 2011 IETF에 의해 RFC 6455에서 표준화 …

+ 여기에 보기

Source: urmaru.com

Date Published: 4/24/2021

View: 8703

websocket, socket.io를 이용한 양방향 통신

websocket이란 웹 서버와 웹 브라우저간 실시간 양방향 통신환경을 제공해주는 실시간 통신 기술입니다. 위의 Polling 방식(요청-응답방식)과 다르게 …

+ 더 읽기

Source: www.secmem.org

Date Published: 2/10/2021

View: 7547

주제와 관련된 이미지 웹 소켓 통신

주제와 관련된 더 많은 사진을 참조하십시오 오늘의 테크용어 : 웹소켓이 뭐냐면. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

오늘의 테크용어 : 웹소켓이 뭐냐면
오늘의 테크용어 : 웹소켓이 뭐냐면

주제에 대한 기사 평가 웹 소켓 통신

  • Author: 코딩애플
  • Views: 조회수 45,242회
  • Likes: 좋아요 1,310개
  • Date Published: 2022. 1. 21.
  • Video Url link: https://www.youtube.com/watch?v=yXPCg5eupGM

웹 소켓 통신 (Web Socket)

웹 소켓 통신

(Web Socket)

웹 소켓(Web Socket)은 두 프로그램간의 메시지를 교환하기 위한 통신방법 중 하나입니다. 웹 소켓은 W3C와 IETF에 의해 자리잡은 표준 프로토콜 중 하나이기 때문에, 현재 인터넷을 사용하는 환경에서 특히 많이 사용되고 있습니다. 예를 들면, 크롬(Chrome)이나 엣지(Edge) 등의 웹 브라우저 같은 경우에 웹 소켓 프로토콜을 지원하고 있기 때문에, 웹 브라우저를 통해서 웹 소켓을 사용하려고 한다면, javascript를 사용해서 어렵지 않게 개발할 수 있습니다.

웹 소켓 특징 2가지

1. 양방향 통신(Full-Duplex)

양방향 통신이란 데이터 송수신을 동시에 처리할 수 있는 통신방법을 말하는 것입니다. 웹 소켓은 클라이언트(client)와 서버(server)가 서로에게 원할 때 데이터를 주고 받을 수 있으니 양방향이라고 말할 수 있는 것이죠.

※ 참고로, 양방향 통신이 아닌 단방향 통신은 한쪽으로만 송신이 가능한 방법을 말하는 것입니다.

2. 실시간 네트워킹(Real Time-Networking)

웹 환경(ex, 웹 브라우저)에서 채팅(chatting), 주식(stock), 비디오(video) 데이터 등의 데이터들은 연속된 데이터를 화면에 빠르게 보여주어야 하거나, 여러 단말기(ex, PC, 스마트폰)에 빠르게 데이터를 교환하는 실시간처리가 필요한 부분들이 있습니다. 예를 들어, 요즘 가상화폐들의 변하는 가격들을 웹 사이트에서 실시간으로 볼 수 있는데 이런 서비스를 구현할 때 사용될 수 있는 것이죠.

※ 웹 소켓 특징 중 하나가 실시간 네트워킹인 이유는 웹 소켓이 아닌 다른 비슷한 기술들로는 웹 브라우저 위에서 실시간으로 통신하기가 웹 소켓에 비해 상대적으로 어렵기 때문입니다.

웹 소켓 이전의 비슷한 기술

Polling Long Polling Streaming XML Http Request Ajax (Asynchronous Javascript + XML)

사실, 웹 소켓이 등장하기 이전에, 웹 소켓의 기능과 동일하게 만들 수 있는 기술들이 있었습니다. 만약에, 웹 소켓의 이해가 부족하거나 웹 소켓을 이용해서 개발하기가 부담스러운 환경이라면, 기존의 기술들인 위 목록에 나와있는 것들 중에서 하나를 골라서 개발을 해도 웹 소켓의 기능을 비슷하게 구현가능 할 것입니다. 본 포스팅에서는 웹 소켓이 가지는 “양방향 통신”과 “실시간 통신”이라는 두가지 특징을 가지고 이전의 다른 기술들보다 조금 더 쉽게 구현할 수 있다는 것만 알아두겠습니다.

※ XML Http Request이나 Ajax의 경우,클라이언트가 서버에게 원할 때 데이터를 보내서 요청하는 것이 목적이기 때문에, 그 반대가 어렵습니다. 서버가 클라이언트에게 원할 때 데이터를 보내는 것은 어렵다는 것이죠.

웹 소켓 동작방법

웹 소켓 Handshaking 메시지 교환

Web Client 는 handshake 요청 메시지를 Web Server 에게 보낸다 . Web Server 는 handshake 응답 메시지를 Web Client에게 보낸다. Web Client 는 data payload frames 를 Web Server 에게 보낸다 . Web Server 는 data payload frames 를 Web Client 에게 보낸다 . Web Client 는 close frame 을 Web Server 에게 보낸다 . Web Server 는 close frame 을 Web Client 에게 보낸다 .

웹 소켓 프로토콜 특징

최초 접속에서만 http 프로토콜 위에서 handshaking 을 하기 때문에 http header 를 사용한다 .

프로토콜 위에서 을 하기 때문에 를 사용한다 websocket 을 위한 별도의 포트는 없으며 , 기존 포트 (http-80, https-443) 를 사용한다 .

을 위한 별도의 포트는 없으며 기존 포트 를 사용한다 websocket 프로토콜의 ws 는 http 기반으로 운영되고 , wss 는 https 기반으로 운영된다 .

프로토콜의 는 기반으로 운영되고 는 기반으로 운영된다 메시지 (Upgrade:Websocket, Connection:Upgrade)

메시지에 포함될 수있는 교환 가능한 메시지는 텍스트 (text) 와 바이너리 (binary) 이다 .

웹 소켓 개발

웹 소켓 동작에 대한 이해를 돕기 위해, 실제로 웹 소켓을 사용해서 개발해야하는 경우, 개발환경에 따라 어떻게 사용될 수 있는지를 코드 일부를 추가해봤습니다. 우선 위 그림을 보면, 3개의 클라이언트와 한 개의 서버가 그려져 있습니다. 클라이언트 중 둘(=A와 B)은 javascript 코드를 사용해서 구현된 웹 애플리케이션(Web Application) 형태로 웹브라우저 위에서 동작되고, 다른 하나(=C)는 java 코드를 사용해서 구현된 안드로이드 애플리케이션(Android Appliacation) 형태로 동작되고 있다고 생각해보겠습니다. 이 3개의 클라이언트 애플리케이션는 웹 서버인 D와 웹 소켓을 사용해서 통신이 가능합니다.

웹 클라이언트인 A, B, C는 모두 서버 D와 통신하기 위해 “ws://joker.com/say”로 접속요청을 하고 있는 것을 볼 수 있습니다. 클라이언트는 서버에서 웹소켓을 위해 열어둔 해당 주소로 메시지를 보낼 수 있습니다. 반대로,서버가 접속된 클라이언트의 웹 소켓을 통해 메시지를 보낼 수 있죠. 이렇게 서로 웹 소켓이 연결되어 있다면 이를 통해 서로에게 원할 때 메시지를 보낼 수 있는 양방향 통신을 할 수 있게 되는 것입니다.

1. 클라이언트 코드

클라이언트로 사용할 수 있는 코드 몇 가지를 소개하겠습니다. 웹 소켓은 웹 기반의 기술이다보니 크롬(chrome), 엣지(edge) 등의 유명한 브라우저들은 개발자들이 쉽게 사용할 수 있도록 이미 javascript로 제공해주고 있습니다. 먼저, WebSocket API는 거의 대부분 브라우저들이 제공해주고 있습니다. 하지만,가끔 WebSocket API를 제공하지 않는 브라우저들이 있습니다. 그렇다고 사용자들한테 WebSocket이 있는 브라우저로 가서 사용하라고 할 수는 없겠죠. 그래서 웹 브라우저가 WebSocket을 제공해주지 않는다고 하더라도 앞에서 말한 HTTP Streaming이나 HTTP Long Polling 등의 기술들을 통해 WebSocket과 동일하게 동작하도록 시켜주는 SockJS라는 라이브러리가 있습니다. WebSocket API나 SockJS 모두 인터페이스는 거의 동일하기 때문에 큰 차이없이 사용할 수 있을 것입니다.

웹 브라우저가 아닌 다른 플랫폼인 안드로이드에서도 웹 소켓을 사용할 수 있습니다. WebSocketClient라는 라이브러리를 사용하면 웹 소켓 기능을 어렵지 않게 구현할 수 있습니다. 현재(2019년 10월), java나 android에서 웹 소켓을 위해 기본으로 제공해준는 API가 없기 때문에 직접 구현하거나 어느정도 안정되어 사용할 수 있는 WebSocketClient 라이브러리를 사용하면 됩니다.

코드 : javascript

// 거의 모든 브라우저에서 지원 { var uri = “ws://joker.com/say”; var ws = new WebSocket(uri); ws.onopen = function() { .. } }

코드 : javascript (SockJS)

// SockJS Client 사용 { var uri = ” ws://joker.com/say”; var sock = new SockJS(uri); sock.onopen = function() { .. }; }

코드 : Java (in Android)

import org.java_websocket.client.WebSocketClient; { Uri uri = new URI(“ws://joker.com/say”); WebSocketClient ws = new WebSocketClient(uri) { public void onOpen(..) { .. } } }

2. 서버 코드

서버는 스프링(springframework)을 사용하는 경우를 예로 들었습니다. 스프링에서는 웹 소켓에 대한 API를 제공해주고 있기 때문에, 스프링 개발 가이드 등의 많은 곳들에서 관련된 예제들을 살펴볼 수 있을 것입니다. 참고로,아래 registerWebSocketHandlers() 내용 중 “(2)”번 라인의 경우 웹 브라우저에서 WebSocket API를 제공하지 않을 경우, SockJS 라이브러리에 정의된 대로 동작하도록 추가시킨 것입니다. 따라서, “(2)”번 라인의 경우 현재 사용되고 있지만 만약에 모든 브라우저가 기본으로 제공된다면 제거를 해도 상관없을 것입니다.

코드 : Java (using Spring Framework)

// import org.springframework.web.socket.WebSocketHandler; @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { private final WebSocketHandlerwsHandler; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new wsHandler(), “/say”).setAllowedOrigins(“*”); // (1) registry.addHandler(new wsHandler(), “/say”).setAllowedOrigins(“*”).withSockJS(); // (2) } }

웹 소켓 보안 고려사항

1. Non browser clients

웹 소켓은 클라이언트를 웹 브라우저를 사용해서 운영될 경우, header의 origin정보를 확인함으로써, 악성 javascript를 걸러낼 수 있습니다. 이 말은 웹 브라우저에서 기존에 사용하고 있던 동일 근원 정책(Same-Origin Policy)을 통해 악성 리소스(resource)로부터 보호할 수 있다는 것입니다.

※ Same-Origin Policy는 웹 브라우저의 페이지에 보여지기 위해 필요한 이미지(ex, jpg, png)나 javascript나 css등을 포함하는 모든 리소스(resource)들은 동일한 사이트로부터 가지고 와야한다는 정책으로 웹 브라우저에서 보안을 위해 만들어둔 기술을 말하는 것입니다.

웹 소켓은 클라이언트를 웹 브라우저가 아닌 다른 곳에서(ex, android, ios, windows) 운영될 경우, 악성 resource(ex, 악성 javascript)로부터 보호를 할 수 없으므로, 클라이언트와 서버는 이를 고려해서 사용해야 합니다. 웹 소켓은 웹 브라우저 위의 웹 페이지를 통해 사용되는 환경에서 운영되는 프로토콜로 만들어진 것이기 때문에, 웹 브라우저가 아닌 다른 클라이언트에서는 Same-Origin Policy와 같은 정책들을 전혀 사용할 수 없는 것이죠.

2. Origin considerations

앞에 1번 고려사항에서 언급했듯이, 웹 소켓은 origin 모델을 사용해서 악성 javascript로부터 보호하고 있습니다. 웹 브라우저에서 Same-Origin Policy을 통해 보호을 하고 있듯이, 웹 서버에서도 origin을 확인해야 하는 로직이 추가되어야 합니다.따라서, 서버에서 모르는 origin으로부터 요청이 들어온다면 “HTTP 403 Forbidden” 에러 상태 코드로 응답을 해서 통신을 못하도록 막아야 합니다.

3. WebSocket Client Authentication

웹 소켓 프로토콜은 핸드셰이킹(handshaking) 단계에서 서버가 클라이언트를 인증하는 특별한 방법을 제시하지 않고 있습니다. 따라서, 클라이언트 인증이 필요한 경우 HTTP 인증이나 TLS 인증 등을 사용해야 합니다.

※ 참고로, TLS 인증의 경우 핸드셰이킹 과정에서 클라이언트와 서버는 서로에게 자신의 인증서(Ceritificate)를 전달하고 이를 검증함으로써, 인증을 할 수 있습니다.

참고

Javascript WebSocket API 설명

https://developer.mozilla.org/ko/docs/Web/API/WebSocket

SockJS API 라이브러리

https://mvnrepository.com/artifact/org.webjars/sockjs-client/0.3.4

WebSocket 프로토콜 RFC 6455

https://tools.ietf.org/html/rfc6455

Http통신 vs Socket통신 (WebSocket)

728×90

네트워크를 통해 서버로 데이터를 가져오기 위한 통신방법 http통신, socket통신

1.Http 통신

Client의 요청이 있을때만, 서버가 응답해서 정보를 전송하고, 곧바로 연결을 끊는 방식

즉, Client가 요청을 보내고 server가 응답하는 단방향통신 (연결상태유지x : stateless)

실시간이 아니라 필요한경우에만 server로접근하는 콘텐츠위주의 데이터를 사용할때 용이

예를 들어 블로그에 들어오는 상황

웹브라우저(Client)가 웹서버로 글에 대한 내용을 보내달라고 요청을 해서,

서버가 전달해주고, 바로 연결종료하는 http통신방식

2.Socket 통신

Client와 Server가 특정port을 통해 연결을 성립하고 있어서, 실시간으로 양방향 통신을 하는 방식

Client가 Server한테만 요청을 보내는 http와 달리

Server 역시 Client한테 요청을 보낼 수 있는 양방향통신 (연결상태유지 : stateful)

계쏙 연결을 유지하는 연결지향형 통신이라 실시간통신이 필요한 경우에 자주사용

예를들어 실시간 스트리밍중계나, 실시간채팅

Client가 서버한테 동영상을 요청하고, 동영상이 종료되는 순간까지 통신을 해야하기 때문에 소켓통신방식

웹소켓방식

웹에서 사용하는 socket통신방식

프로토콜은 ws(websocket), wss(websocket secure) 사용

포트는 HTTP(80), HTTPS(443)과 동일한 포트사용

클라이언트와 서버가 지속적으로 TCP라인을 통해 지속적으로 연결된 양방향 통신

[http통신과 socket통신 차이]mangkyu.tistory.com/48

[WebSocket] victorydntmd.tistory.com/250

반응형

RFC 6455 명세서에 정의된 프로토콜인 웹소켓(WebSocket) 을 사용하면 서버와 브라우저 간 연결을 유지한 상태로 데이터를 교환할 수 있습니다. 이때 데이터는 ‘패킷(packet)’ 형태로 전달되며, 전송은 커넥션 중단과 추가 HTTP 요청 없이 양방향으로 이뤄집니다.

이런 특징 때문에 웹소켓은 온라인 게임이나 주식 트레이딩 시스템같이 데이터 교환이 지속적으로 이뤄져야 하는 서비스에 아주 적합합니다.

웹소켓 커넥션을 만들려면 new WebSocket 을 호출하면 되는데, 이때 ws 라는 특수 프로토콜을 사용합니다.

let socket = new WebSocket(“ws://javascript.info”);

ws 말고 wss:// 라는 프로토콜도 있는데, 두 프로토콜의 관계는 HTTP와 HTTPS의 관계와 유사합니다.

항상 wss:// 를 사용합시다. wss:// 는 보안 이외에도 신뢰성(reliability) 측면에서 ws 보다 좀 더 신뢰할만한 프로토콜입니다. ws:// 를 사용해 데이터를 전송하면 데이터가 암호화되어있지 않은 채로 전송되기 때문에 데이터가 그대로 노출됩니다. 그런데 아주 오래된 프락시 서버는 웹소켓이 무엇인지 몰라서 ‘이상한’ 헤더가 붙은 요청이 들어왔다고 판단하고 연결을 끊어버립니다. 반면 wss:// 는 TSL(전송 계층 보안(Transport Layer Security))이라는 보안 계층을 통과해 전달되므로 송신자 측에서 데이터가 암호화되고, 복호화는 수신자 측에서 이뤄지게 됩니다. 따라서 데이터가 담긴 패킷이 암호화된 상태로 프락시 서버를 통과하므로 프락시 서버는 패킷 내부를 볼 수 없게 됩니다.

소켓이 정상적으로 만들어지면 아래 네 개의 이벤트를 사용할 수 있게 됩니다.

open – 커넥션이 제대로 만들어졌을 때 발생함

– 커넥션이 제대로 만들어졌을 때 발생함 message – 데이터를 수신하였을 때 발생함

– 데이터를 수신하였을 때 발생함 error – 에러가 생겼을 때 발생함

– 에러가 생겼을 때 발생함 close – 커넥션이 종료되었을 때 발생함

커넥션이 만들어진 상태에서 무언가를 보내고 싶으면 socket.send(data) 를 사용하면 됩니다.

예시를 살펴봅시다.

let socket = new WebSocket(“wss://javascript.info/article/websocket/demo/hello”); socket.onopen = function(e) { alert(“[open] 커넥션이 만들어졌습니다.”); alert(“데이터를 서버에 전송해봅시다.”); socket.send(“My name is Bora”); }; socket.onmessage = function(event) { alert(`[message] 서버로부터 전송받은 데이터: ${event.data}`); }; socket.onclose = function(event) { if (event.wasClean) { alert(`[close] 커넥션이 정상적으로 종료되었습니다(code=${event.code} reason=${event.reason})`); } else { // 예시: 프로세스가 죽거나 네트워크에 장애가 있는 경우 // event.code가 1006이 됩니다. alert(‘[close] 커넥션이 죽었습니다.’); } }; socket.onerror = function(error) { alert(`[error] ${error.message}`); };

위 예시는 데모 목적을 위해 만들어놓은 간이 Node.js 서버(server.js)에서 돌아갑니다. 서버는 ‘Hello from server, Bora’라는 메시지가 담긴 응답을 클라이언트에 보내고, 5초 후 커넥션을 종료시킵니다.

서버 쪽 코드가 동작하면서 open → message → close 순의 이벤트를 볼 수 있었던 것이죠.

이제 여러분은 웹소켓 통신이 어떻게 이뤄지는지를 알게 되셨습니다. 생각보다 꽤 간단하죠?

지금부턴 실무 수준에서 웹소켓을 활용할 수 있도록 웹소켓에 대해 좀 더 자세히 알아봅시다.

new WebSocket(url) 을 호출해 소켓을 생성하면 즉시 연결이 시작됩니다.

커넥션이 유지되는 동안, 브라우저는 (헤더를 사용해) 서버에 ‘웹소켓을 지원하나요?’라고 물어봅니다. 이에 서버가 ‘네’라는 응답을 하면 서버-브라우저간 통신은 HTTP가 아닌 웹소켓 프로토콜을 사용해 진행됩니다.

이번엔 new WebSocket(“wss://javascript.info/chat”) 을 호출해 최초 요청을 전송했다고 가정하고, 이때의 요청 헤더를 살펴봅시다.

GET /chat Host: javascript.info Origin: https://javascript.info Connection: Upgrade Upgrade: websocket Sec-WebSocket-Key: Iv8io/9s+lYFgZWcXczP8Q== Sec-WebSocket-Version: 13

Origin – 클라이언트 오리진(예시에선 https://javascript.info )을 나타냅니다. 서버는 Origin 헤더를 보고 어떤 웹사이트와 소켓통신을 할지 결정하기 때문에 Origin 헤더는 웹소켓 통신에 중요한 역할을 합니다. 참고로 웹소켓 객체는 기본적으로 크로스 오리진(cross-origin) 요청을 지원합니다. 웹소켓 통신만을 위한 전용 헤더나 제약도 없습니다. 오래된 서버는 웹소켓 통신을 지원하지 못하기 때문에 웹소켓 통신은 호환성 문제도 없습니다.

– 클라이언트 오리진(예시에선 )을 나타냅니다. 서버는 헤더를 보고 어떤 웹사이트와 소켓통신을 할지 결정하기 때문에 Origin 헤더는 웹소켓 통신에 중요한 역할을 합니다. 참고로 웹소켓 객체는 기본적으로 크로스 오리진(cross-origin) 요청을 지원합니다. 웹소켓 통신만을 위한 전용 헤더나 제약도 없습니다. 오래된 서버는 웹소켓 통신을 지원하지 못하기 때문에 웹소켓 통신은 호환성 문제도 없습니다. Connection: Upgrade – 클라이언트 측에서 프로토콜을 바꾸고 싶다는 신호를 보냈다는 것을 나타냅니다.

– 클라이언트 측에서 프로토콜을 바꾸고 싶다는 신호를 보냈다는 것을 나타냅니다. Upgrade: websocket – 클라이언트측에서 요청한 프로토콜은 ‘websocket’이라는걸 의미합니다.

– 클라이언트측에서 요청한 프로토콜은 ‘websocket’이라는걸 의미합니다. Sec-WebSocket-Key – 보안을 위해 브라우저에서 생성한 키를 나타냅니다.

– 보안을 위해 브라우저에서 생성한 키를 나타냅니다. Sec-WebSocket-Version – 웹소켓 프로토콜 버전이 명시됩니다. 예시에서 버전은 13입니다.

웹소켓 핸드셰이크는 모방이 불가능합니다. 바닐라 자바스크립트로 헤더를 설정하는 건 기본적으로 막혀있기 때문에 XMLHttpRequest 나 fetch 로 위 예시와 유사한 헤더를 가진 HTTP 요청을 만들 수 없습니다.

서버는 클라이언트 측에서 보낸 웹소켓 통신 요청을 최초로 받고 이에 동의하면, 상태 코드 101이 담긴 응답을 클라이언트에 전송합니다.

101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g=

여기서 Sec-WebSocket-Accept 는 Sec-WebSocket-Key 와 밀접한 관계가 있습니다. 브라우저는 특별한 알고리즘을 사용해 서버에서 생성한 Sec-WebSocket-Accept 값을 받아, 이 응답이 자신이 보낸 요청에 대응하는 응답인지를 확인합니다.

이렇게 핸드셰이크가 끝나면 HTTP 프로토콜이 아닌 웹소켓 프로토콜을 사용해 데이터가 전송되기 시작합니다. 전홍이 시작된 후에 어떤일이 일어나는지는 조금 후에 자세히 살펴보겠습니다.

웹소켓 통신은 Sec-WebSocket-Extensions 와 Sec-WebSocket-Protocol 헤더를 지원합니다. 두 헤더는 각각 웹소켓 프로토콜 기능을 확장(extension)할 때와 서브 프로토콜(subprotocal)을 사용해 데이터를 전송할 때 사용합니다.

각 헤더에 대한 예시를 살펴봅시다.

Sec-WebSocket-Extensions: deflate-frame – 이 헤더는 브라우저에서 데이터 압축(deflate)을 지원한다는 것을 의미합니다. Sec-WebSocket-Extensions 은 브라우저에 의해 자동 생성되는데, 그 값엔 데이터 전송과 관련된 무언가나 웹소켓 프로토콜 기능 확장과 관련된 무언가가 여러 개 나열됩니다.

Sec-WebSocket-Protocol: soap, wamp – 이렇게 헤더가 설정되면 평범한 데이터가 아닌 SOAP나 WAMP(The WebSocket Application Messaging Protocol) 프로토콜을 준수하는 데이터를 전송하겠다는 것을 의미합니다. 웹소켓에서 지원하는 서브프로토콜 목록은 IANA 카탈로그에서 확인할 수 있습니다. 개발자는 이 헤더를 보고 앞으로 사용하게 될 데이터 포맷을 확인할 수 있습니다. 두 헤더는 new WebSocket 의 두 번째 매개변수에 값을 넣어서 설정할 수 있습니다. 서브 프로토콜로 SOAP나 WAMP를 사용하고 싶다고 가정해 봅시다. 두 번째 매개변수에 다음과 같이 배열을 넣으면 됩니다. let socket = new WebSocket(“wss://javascript.info/chat”, [“soap”, “wamp”]);

이때 서버는 지원 가능한 익스텐션과 프로토콜을 응답 헤더에 담아 클라이언트에 전달해야 합니다.

예시를 살펴봅시다. 요청 헤더는 다음과 같습니다.

GET /chat Host: javascript.info Upgrade: websocket Connection: Upgrade Origin: https://javascript.info Sec-WebSocket-Key: Iv8io/9s+lYFgZWcXczP8Q== Sec-WebSocket-Version: 13 Sec-WebSocket-Extensions: deflate-frame Sec-WebSocket-Protocol: soap, wamp

이때 서버가 다음과 같은 응답을 했다고 해봅시다.

101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g= Sec-WebSocket-Extensions: deflate-frame Sec-WebSocket-Protocol: soap

이 경우, 우리는 서버에선 ‘deflate-frame’이라는 익스텐션과 요청 프로토콜 중 SOAP라는 서브 프로토콜만 지원한다는 사실을 알 수 있습니다.

웹소켓 통신은 ‘프레임(frame)’이라 불리는 데이터 조각을 사용해 이뤄집니다. 프레임은 서버와 클라이언트 양측 모두에서 보낼 수 있는데 프레임 내 담긴 데이터 종류에 따라 다음과 같이 분류할 수 있습니다.

텍스트 프레임(text frame) – 텍스트 데이터가 담긴 프레임

이진 데이터 프레임(binary data frame) – 이진 데이터가 담긴 프레임

핑 또는 퐁 프레임(ping/pong frame) – 커넥션이 유지되고 있는지 확인할 때 사용하는 프레임으로 서버나 브라우저에서 자동 생성해서 보내는 프레임

이 외에도 ‘커넥션 종료 프레임(connection close frame) 등 다양한 프레임이 있음

브라우저 환경에서 개발자는 텍스트나 이진 프레임만 다루게 됩니다.

이유는 WebSocket .send() 메서드는 텍스트나 바이너리 데이터만 보낼 수 있기 때문입니다.

socket.send(body) 를 호출할 때, body 엔 문자열이나 Blob , ArrayBuffer 등의 이진 데이터만 들어갈 수 있습니다. 데이터 종류에 따라 특별히 무언가 세팅을 해줘야 할 필요는 없고, 텍스트나 바이너리 타입의 데이터를 넣어주면 알아서 데이터가 전송됩니다.

한편, 데이터를 받을 때, 텍스트 데이터는 항상 문자열 형태로 옵니다. 이진 데이터를 받을 때엔 Blob 이나 ArrayBuffer 포맷 둘 중 하나를 고를 수 있습니다.

socket.binaryType 프로퍼티를 사용하면 Blob 이나 ArrayBuffer 포맷 둘 중 하나를 고를 수 있는데, 프로퍼티 기본값은 “blob” 이라서 이진 데이터는 기본적으로 Blob 객체 형태로 전송받게 됩니다.

Blob은 고차원(high-level)의 이진 객체인데, 등의 태그와 바로 통합할 수 있어서 기본값으로 아주 적절합니다. 하지만 이진 데이터를 처리하는 과정에 개별 데이터 바이트에 접근해야 하는 경우엔 프로퍼티 값을 “arraybuffer” 로 바꿀 수도 있습니다.

socket.binaryType = “arraybuffer”; socket.onmessage = (event) => { // event.data는 (텍스트인 경우) 문자열이거나 (이진 데이터인 경우) arraybuffer 입니다. };

Imagine, our app is generating a lot of data to send. But the user has a slow network connection, maybe on a mobile internet, outside of a city.

We can call socket.send(data) again and again. But the data will be buffered (stored) in memory and sent out only as fast as network speed allows.

The socket.bufferedAmount property stores how many bytes are buffered at this moment, waiting to be sent over the network.

We can examine it to see whether the socket is actually available for transmission.

// every 100ms examine the socket and send more data // only if all the existing data was sent out setInterval(() => { if (socket.bufferedAmount == 0) { socket.send(moreData()); } }, 100);

Normally, when a party wants to close the connection (both browser and server have equal rights), they send a “connection close frame” with a numeric code and a textual reason.

The method for that is:

socket.close([code], [reason]);

code is a special WebSocket closing code (optional)

is a special WebSocket closing code (optional) reason is a string that describes the reason of closing (optional)

Then the other party in close event handler gets the code and the reason, e.g.:

// closing party: socket.close(1000, “Work complete”); // the other party socket.onclose = event => { // event.code === 1000 // event.reason === “Work complete” // event.wasClean === true (clean close) };

Most common code values:

1000 – the default, normal closure (used if no code supplied),

– the default, normal closure (used if no supplied), 1006 – no way to such code manually, indicates that the connection was lost (no close frame).

There are other codes like:

1001 – the party is going away, e.g. server is shutting down, or a browser leaves the page,

– the party is going away, e.g. server is shutting down, or a browser leaves the page, 1009 – the message is too big to process,

– the message is too big to process, 1011 – unexpected error on server,

– unexpected error on server, …and so on.

The full list can be found in RFC6455, §7.4.1.

WebSocket codes are somewhat like HTTP codes, but different. In particular, any codes less than 1000 are reserved, there’ll be an error if we try to set such a code.

// in case connection is broken socket.onclose = event => { // event.code === 1006 // event.reason === “” // event.wasClean === false (no closing frame) };

To get connection state, additionally there’s socket.readyState property with values:

0 – “CONNECTING”: the connection has not yet been established,

– “CONNECTING”: the connection has not yet been established, 1 – “OPEN”: communicating,

– “OPEN”: communicating, 2 – “CLOSING”: the connection is closing,

– “CLOSING”: the connection is closing, 3 – “CLOSED”: the connection is closed.

Let’s review a chat example using browser WebSocket API and Node.js WebSocket module https://github.com/websockets/ws. We’ll pay the main attention to the client side, but the server is also simple.

HTML: we need a

to send messages and a

for incoming messages:

From JavaScript we want three things:

Open the connection. On form submission – socket.send(message) for the message. On incoming message – append it to div#messages .

Here’s the code:

let socket = new WebSocket(“wss://javascript.info/article/websocket/chat/ws”); // send message from the form document.forms.publish.onsubmit = function() { let outgoingMessage = this.message.value; socket.send(outgoingMessage); return false; }; // message received – show the message in div#messages socket.onmessage = function(event) { let message = event.data; let messageElem = document.createElement(‘div’); messageElem.textContent = message; document.getElementById(‘messages’).prepend(messageElem); }

Server-side code is a little bit beyond our scope. Here we’ll use Node.js, but you don’t have to. Other platforms also have their means to work with WebSocket.

The server-side algorithm will be:

Create clients = new Set() – a set of sockets. For each accepted websocket, add it to the set clients.add(socket) and setup message event listener to get its messages. When a message received: iterate over clients and send it to everyone. When a connection is closed: clients.delete(socket) .

const ws = new require(‘ws’); const wss = new ws.Server({noServer: true}); const clients = new Set(); http.createServer((req, res) => { // here we only handle websocket connections // in real project we’d have some other code here to handle non-websocket requests wss.handleUpgrade(req, req.socket, Buffer.alloc(0), onSocketConnect); }); function onSocketConnect(ws) { clients.add(ws); ws.on(‘message’, function(message) { message = message.slice(0, 50); // max message length will be 50 for(let client of clients) { client.send(message); } }); ws.on(‘close’, function() { clients.delete(ws); }); }

Here’s the working example:

You can also download it (upper-right button in the iframe) and run locally. Just don’t forget to install Node.js and npm install ws before running.

WebSocket is a modern way to have persistent browser-server connections.

WebSockets don’t have cross-origin limitations.

They are well-supported in browsers.

Can send/receive strings and binary data.

The API is simple.

Methods:

socket.send(data) ,

, socket.close([code], [reason]) .

Events:

open ,

, message ,

, error ,

, close .

WebSocket by itself does not include reconnection, authentication and many other high-level mechanisms. So there are client/server libraries for that, and it’s also possible to implement these capabilities manually.

Sometimes, to integrate WebSocket into existing project, people run WebSocket server in parallel with the main HTTP-server, and they share a single database. Requests to WebSocket use wss://ws.site.com , a subdomain that leads to WebSocket server, while https://site.com goes to the main HTTP-server.

Surely, other ways of integration are also possible.

위키백과, 우리 모두의 백과사전

웹소켓 웹소켓을 사용한 연결을 나타낸 그림 국제 표준 RFC 6455 개발사 IETF 산업 컴퓨터 과학 단자 유형 TCP 웹사이트 웹소켓

웹소켓(WebSocket)은 하나의 TCP 접속에 전이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜이다. 웹소켓 프로토콜은 2011년 IETF에 의해 RFC 6455로 표준화되었으며 웹 IDL의 웹소켓 API는 W3C에 의해 표준화되고 있다.

웹소켓은 HTTP와 구별된다. 두 프로토콜 모두 OSI 모델의 제7계층에 위치해 있으며 제4계층의 TCP에 의존한다. 이들에 차이가 있으나 “RFC 6455″에 따르면 웹소켓은 HTTP 포트 80과 443 위에 동작하도록 설계되었으며 HTTP 프록시 및 중간 층을 지원하도록 설계되었으므로 HTTP 프로토콜과 호환이 된다. 호환을 달성하기 위해 웹소켓 핸드셰이크는 HTTP 업그레이드 헤더를 사용하여[1] HTTP 프로토콜에서 웹소켓 프로토콜로 변경한다.

웹소켓 프로토콜은 HTTP 폴링과 같은 반이중방식에 비해 더 낮은 부하를 사용하여 웹 브라우저(또는 다른 클라이언트 애플리케이션)과 웹 서버 간의 통신을 가능케 하며, 서버와의 실시간 데이터 전송을 용이케 한다. 이는 먼저 클라이언트에 의해 요청을 받는 방식이 아닌, 서버가 내용을 클라이언트에 보내는 표준화된 방식을 제공함으로써, 또 연결이 유지된 상태에서 메시지들을 오갈 수 있게 허용함으로써 가능하게 되었다. 이러한 방식으로 양방향 대화 방식은 클라이언트와 서버 간에 발생할 수 있다. 통신은 TCP 포트 80(TLS 암호화 연결의 경우 443)를 통해 수행되며 방화벽을 통해 웹이 아닌 인터넷 연결을 차단하는 일부 환경에 도움이 된다. 단순 양방향 브라우저-서버 통신은 코멧 등의 스톱갭(stopgap) 기술을 사용하는 비표준 방식으로 수행된다.

구글 크롬, 마이크로소프트 에지, 인터넷 익스플로러, 파이어폭스, 사파리, 오페라 등 대부분의 브라우저가 이 프로토콜을 지원한다.

개요 [ 편집 ]

HTTP와 달리 웹소켓은 전이중 통신을 사용한다.[2][3] 또, 웹소켓은 TCP 위에서 메시지 스트리밍을 가능케 한다. TCP 단독으로는 메시지의 상속 개념 없이 바이트 스트림을 다룬다. 웹소켓 이전에는 포트 80 전이중 통신은 코멧 채널을 사용하여 수행이 가능했다. 그러나 코멧 구현체는 사소한 것이 아니었으며 TCP 핸드셰이크와 HTTP 헤더 부하로 인해 작은 메시지에는 비효율적이다. 웹소켓 프로토콜은 웹의 보안 문제를 타협하지 않고 이 문제를 해결하는 것을 목적으로 한다.

웹소켓 프로토콜 사양은 2개의 새로운 통합 자원 식별자(URI) 스킴으로 ws (WebSocket), wss (WebSocket Secure)를 정의하며[4] 이들은 암호화되지 않은 연결과 암호화된 연결에 각각 사용된다.

역사 [ 편집 ]

웹소켓은 TCP 기반 소켓 API를 대체할 목적으로 HTML5 사양에서 TCPConnection으로 처음 참조되었다.[5] 2008년 6월, 일련의 토론이 마이클 카터(Michael Carter)에 의해 주도되었으며, 웹소켓으로 알려진 최초 버전의 프로토콜이 탄생되었다.[6]

브라우저 구현체 [ 편집 ]

구현체 상태 프로토콜 초안일 인터넷 익스플로러 파이어폭스[7] (PC) 파이어폭스 (안드로이드) 크롬 (PC, 모바일) 사파리 (맥, iOS) 오페라 (PC, 모바일) 안드로이드 브라우저 hixie-75 2010년 2월 4일 4 5.0.0 hixie-76

hybi-00 2010년 5월 6일

2010년 5월 23일 4.0 (비활성화) 6 5.0.1 11.00 (비활성화) 7 hybi-07 2011년 4월 22일 6[8][a] 8 hybi-10 2011년 7월 11일 7[10][a] 7 14[11] 13 RFC 6455 2011년 12월 10[12] 11 11 16[13] 6 12.10[14] 4.4

프로토콜 핸드셰이크 [ 편집 ]

웹소켓을 연결하기 위해 클라이언트는 웹소켓 핸드셰이크 요청을 보내며, 이렇게 하면 서버는 웹소켓 핸드셰이크 응답을 아래의 예에서 보는 바와 같이 반환한다.[15]

클라이언트 요청:

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

서버 응답:

HTTP / 1.1 101 Switching Protocols Upgrade : websocket Connection : Upgrade Sec-WebSocket-Accept : HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol : chat

프록시 경유 [ 편집 ]

웹소켓 프로토콜 클라이언트 구현체는 목적지 호스트와 포트에 연결할 때 사용자 에이전트가 프록시를 사용하도록 구성되어 있는지 확인을 시도하며 만일 그러한 경우 HTTP CONNECT 메소드를 사용하여 영구적인 터널을 구성한다.

웹소켓 프로토콜 그 자체는 프록시 서버와 방화벽을 인지하지 못하지만 HTTP 호환 핸드셰이크의 기능을 제공하므로 HTTP 서버들이 기본 HTTP와 HTTPS 포트(80과 443)를 웹소켓 게이트웨이나 서버와 공유할 수 있게 한다. 웹소켓 프로토콜은 웹소켓과 웹소켓 안전 연결을 나타내기 위해 각각 ws://과 wss:// 두문자를 정의한다. 이 두 스킴은 HTTP 업그레이드 매커니즘을 사용하여 웹소켓 프로토콜로 업그레이드한다. 일부 프록시 서버는 투명(transparent)하며 웹소켓과 잘 동작한다. 다른 것들은 웹소켓이 정상 동작하지 못해 연결을 실패한다. 일부의 경우 추가 프록시 구성이 필요할 수 있으며 웹소켓 지원을 위해 특정 프록시 서버의 업그레이드가 필요할 수 있다.

암호화되지 않은 웹소켓 트래픽이 웹소켓을 지원하지 않는 명시적이거나 투명한 프록시 서버를 통해 경유하는 경우 연결이 실패할 가능성이 높다.[16]

암호화된 웹소켓 연결을 사용하는 경우 웹소켓 보안 연결에 전송 계층 보안(TLS)을 사용함으로써 브라우저가 명시적인 프록시 서버를 사용하도록 구성될 때 HTTP CONNECT 명령이 발행됨을 보증한다.

같이 보기 [ 편집 ]

각주 [ 편집 ]

내용주

가 나 [9] requiring extra code to integrate with existing WebSocket-enabled code. Gecko-based browsers versions 6–10 implement the WebSocket object as “MozWebSocket”,requiring extra code to integrate with existing WebSocket-enabled code.

참조주

[WEB] 🌐 웹 소켓 (Socket) 정리 (역사부터 차근차근)

웹 개발을 처음 배우기 시작했다면 서버와 클라이언트의 통신은 모두 HTTP 프로토콜만 이용해서 이루어진다고 생각할 수 있습니다.

하지만 웹 개발을 하면서 채팅, 게임, 주식 차트 등의 실시간 통신이 필요한 서비스 를 구현하려 하면 HTTP 프로토콜이 아닌 웹소켓 프로토콜을 사용하는 것이 좋다는 이야기를 흔히 찾아볼 수 있습니다.

HTTP의 한계

HTTP는 약속입니다. 약속을 영어로 표현하면, 프로토콜이라고 합니다.

HTTP가 등장하기 이전 세대에서 통신한다 함은, 터미널 창에서 딱딱한 텍스트를 주고 받는 것이었어요.

그런데 HTTP가 등장하니, 시각적으로나 정보량 차원에서 엄청나게 멋진 문서를 주고 받을 수 있게 되었습니다.

그런데 HTTP에는 무서운 대전제가 붙습니다.

사용자가 URL을 요청할 때에만! 서버에서 해당 페이지를 꺼내주는 식이라는 겁니다.

거꾸로 말하자면, 사용자는 서버로부터 새로운 정보를 받아보기 위해서, 반드시 새로운 URL을 요청해야 한다는 말과 같습니다.

예를 들어보겠습니다. 공공기관 웹사이트의 회원가입 과정을 떠올려보세요.

즉, 브라우저가 웹서버에 무엇인가를 요청하려면, 페이지를 이동해야만 했습니다.

사실 그렇게 웹페이지를 이동하는 방식으로 만들어버리면 시각적으로 너무 뻣뻣하고 구렸기 때문에 많은 꼼수들이 등장합니다.

액티브엑스도 그 중 하나입니다.

AJAX 등장

당시에 혜성처럼 등장하기 시작한 구글은 HTTP 규약을 뛰어넘는 방안을 제안합니다.

이름하여 AJAX입니다.

​AJAX는 HTTP를 효과적으로 이용하는 기술입니다.

앞에서 HTTP는 약속이라고 말씀드렸지요? AJAX는 약속은 아닙니다.

효과적으로 서버와 소통하기 위한 기술입니다.

그림으로 비교해보도록 하겠습니다.

다음은 HTTP에 따른 나이브한 통신 방식입니다.

요청 페이지에서 확인을 누르면, 확인을 눌렀다는 정보를 서버에 전달합니다.

웹서버는 요청을 받고, 처리한 후에 HTML 페이지를 생성하고, 유저에게 해당 HTML페이지를 전송합니다.

이 방식을 선택한다면, HTML(즉 웹 페이지)을 하나 새롭게 브라우저에 뿌리게 되고, 결국 새로운 페이지로 이동하는 결과를 마주하게 됩니다.

아래는 AJAX 기술이 들어간, 진일보한 통신 방식입니다.

AJAX를 쓰면, 유저는 새로운 HTML을 서버로부터 받는 것이 아닙니다.

즉, 유저는 새로운 웹페이지로 이동하는 것이 아닙니다. 대신, 동일한 웹페이지 내에서 DOM을 변경하게 됩니다.

요청 페이지에서 이름 칸에 ‘촉새’를 쓰고, 내용에 ‘안녕하세요. 촉새입니다’라고 썼다고 해봅시다.

사용자의 이벤트로부터 Javascript는 해당 이름과 내용이 쓰여진 DOM을 읽습니다. 그리고는 XMLHttpRequest 객체를 통해 웹서버에 해당 이름과 내용을 전송합니다.

웹서버는 요청을 처리하고 XML, Text 혹은 JSON을 XMLHttpRequest 객체에 전송합니다. 그러면, Javascript가 해당 응답 정보를 DOM에 씁니다.

그렇게 결과페이지가 만들어집니다.

AJAX를 쓰면 새로운 HTML을 서버로부터 받아야 하는 것이 아닙니다.

동일한 페이지의 일부를 수정할 수도 있는 가능성이 생깁니다.

결과적으로 사용자 입장에서는 페이지 이동이 발생되지 않고 페이지 내부 변화만 일어나게 됩니다.

HTML 페이지 전체를 다 바꿔야 하는 것이 아니라 부분만 바꿀 수 있게 되는 것입니다.

HTTP vs AJAX

차이1 : 전체를 다 변경해야 하는가? vs 부분만 선별적으로 변경할 수 있는가?

HTTP는 클라이언트쪽에서 Request를 보내고 Server쪽에서 Response를 받으면 이어졌던 연결이 끊기게 되어있습니다. 그래서 화면의 내용을 갱신하기 위해서는 다시 request를 하고 response를 하면서 페이지 전체를 갱신하게 됩니다.

AJAX는 html 페이지 전체가 아닌 일부분만 갱신할수 있도록 XMLHttpRequest객체를 통해 서버에 request 합니다. XMLHttpRequest는 서버와의 연결을 잡아둡니다. Json이나 xml형태로 필요한 데이터만 주고 받으며 DOM을 갱신하기 때문에 그만큼의 자원과 시간을 아낄 수 있습니다.

차이2 : 누가 서버에 요청하는가?

HTTP는 웹브라우저가 서버에 요청합니다.

AJAX는 XMLHttpRequest 객체가 서버에 요청합니다.

차이3 : 페이지의 변경사항이 필요할때마다 페이지를 이동하는가?

HTTP는 항상 페이지를 이동합니다.

AJAX는 조그마한 변경이 필요할 때, 해당 페이지 내에서 변경이 가능합니다.

앞서서 HTTP로 회원가입했을 때 중복체크하는 과정과 비교해볼까요?

AJAX를 쓴다면, 다음과 같은 방식으로 아이디 중복체크하는 것도 가능해집니다.

비밀번호 강도 확인, 검색어 실시간 추천, 마우스 커서나 스크롤바 위치에 반응하는 그림, 지도 표시 서비스 등등 다양합니다.

그러나 여전히 AJAX로 여전히 수행하지 못하는 것들이 있습니다.

​왜냐하면, AJAX도 여전히 HTTP로 서버와 통신하기 때문입니다.

즉, AJAX도 HTTP의 한계를 완전히 벗어나지 못했습니다.

HTTP는 “클라이언트의 요청이 있고 그 다음 서버로부터 응답을 받는 상황”인데, 이 틀로부터 벗어나지 못했습니다.

이러한 경우 외에도 웹 상에서는 갈수록 동적인 표현과 뛰어난 상호작용이 요구되었습니다.

이러한 문제에 대응하기 위해 Comet 이 등장했습니다. 하지만, 이 방법은 “클라이언트의 요청이 없음에도, 서버로부터 응답을 받는 상황”에 대한 미봉책이었습니다.

즉, 데이터 수신을 위해 서버가 클라이언트에게 전송해 주는 푸시(push)방식이 아니라 여전히 클라이언트가 서버에에게 요청하는 폴링(polling) 방식이었습니다.

이와 같은 애로사항은 HTML5 개발 과정에 녹아들었습니다.

결국, HTML5은 순수 웹 환경에서 실시간 양방향 통신이 가능해지게 만들어졌습니다.

그 스펙의 명칭이 바로 웹 소켓(Web Socket) 입니다.

AJAX는 이름이 왜 AJAX 인가요? Asynchronous Javascript And Xml의 약자입니다. (비동기적인) 자바스크립트로 DOM을 읽고 쓰며,

XMLHttpRequest 객체를 통해 서버와 데이터를 주고받기 때문에 명명되어졌습니다.

HTTP와 HTTPS에는 무슨 차이가 있나요? 뒤에 붙은 S는 Secured의 S입니다.

웹페이지를 요청하는 사람이 무슨 페이지를 요청하는지, 서버가 유저에게 어떤 페이지를 주었는지가 암호화됩니다.

우리 정부가 야동 사이트, 불법 웹툰 사이트, 불법 도박 사이트 등을 전부 없애지 못하는 이유도 이 S 때문입니다.

웹 소켓 이란?

웹소켓은 HTML5 표준 기술로, 사용자의 브라우저와 서버 사이의 동적인 양방향 연결 채널을 구성합니다.

Websocket API를 통해 서버로 메세지를 보내고, 요청 없이 응답을 받아오는 것이 가능합니다.

웹소켓은 매우 단순한 API로 구성되어 있습니다.

웹소켓을 이용하면 하나의 HTTP 접속으로 양방향 메시지를 자유롭게 주고받을 수 있습니다.

웹소켓 통신과 비교하면 xmlhttprequest에서는 통신할 때마다 꼭 요청 헤더가 부여되기 때문에 불과 1바이트의 정보를 송신하고 싶어도 수 킬로바이트에 달하는 쓸데없는 정보를 보내야 합니다.

예를 들어, 채팅 입력을 한 문자마다 서버에 송신하고 싶은 경우처럼, 실시간을 추구한 애플리케이션에서는 이 점이 성능 차이로 이어질 가능성이 크다고 할 수 있습니다.

HTTP통신방법과 WebSocket의 차이점

지금까지 존재했던 통신방법과 WebSocket의 결정적인 차이는 프로토콜에 있습니다.

WebSocket 프로토콜은 접속 확립에 HTTP를 사용하지만, 그 후의 통신은 WebSocket 독자의 프로토콜로 이루어집니다. 또한, header가 상당히 작아 overhead가 적은 특징 이 있습니다.

장시간 접속을 전제로 하기 때문에, 접속한 상태라면 클라이언트나 서버로부터 데이터 송신이 가능합니다.

더불어 데이터의 송신과 수신에 각각 커넥션을 맺을 필요가 없어, 하나의 커넥션으로 데이터를 송수신 할 수 있습니다.

그리고 통신시에 지정되는 URL은 http://www.sample.com/ 과 같은 형식이 아니라 ws://www.sample.com/ 과 같은 형식이 됩니다.

WebSocket 소켓이 필요한 경우

실시간 양방향 데이터 통신이 필요한 경우. 많은 수의 동시 접속자를 수용해야 하는 경우. 브라우저에서 TCP 기반의 통신으로 확장해야 하는 경우. 개발자에게 사용하기 쉬운 API가 필요할 경우. 클라우드 환경이나 웹을 넘어 SOA(Service Oriented Architecture) 로 확장해야 하는 경우

WebSocket 서버의 종류

pywebsocket(apache)

phpwebsocket(php)

jWebSocket(java,javascript)

web-socket-ruby(ruby)

Socket.IO(node.js)

Socket.io

그러나 웹소켓은 HTML5의 기술이기 때문에 오래된 버전의 웹 브라우저는 웹소켓을 지원하지 않습니다.

특히 자동 업데이트가 되지 않는 익스플로러 구 버전 사용자들은 웹소켓으로 작성된 웹페이지를 볼 수 없지요.

따라서 이를 해결하기 위해 나온 여러 기술 중 하나가 Socket.io 입니다.

웹페이지가 열리는 브라우저가 웹소켓을 지원하면 웹소켓 방식으로 동작하고,

지원하지 않는 브라우저라면 일반 http를 이용해서 실시간 통신을 흉내내는 것입니다.

Socket.io는 node.js 기반으로 만들어진 기술로, 거의 모든 웹 브라우저와 모바일 장치를 지원하는 실시간 웹 애플리케이션 지원 라이브러리입니다.

이것은 100% 자바스크립트로 구현되어 있으며, 현존하는 대부분의 실시간 웹 기술들을 추상화해 놓았습니다.

다시 말해, Socket.io는 자바스크립트를 이용하여 브라우저 종류에 상관없이 실시간 웹을 구현할 수 있도록 한 기술입니다.

Socket.io는 웹 브라우저와 웹 서버의 종류와 버전을 파악하여 가장 적합한 기술을 선택하여 사용합니다.

만약 브라우저에 FlashSocket이라는 기술을 지원하는 플러그인이 설치되어 있으면 그것을 사용하고 플러그인이 없으면 AJAX Long Polling 방식을 사용하도록 합니다.

왜 웹소켓을 사용하는가?

초창기 웹은 단순히 인터넷에 접속한 사용자에게 콘텐츠를 전달하는 역할에 지나지 않았습니다.

사용자와의 상호작용은 크게 중요하지 않았으며, 정보의 검색 및 열람 수준에 그쳤습니다.

하지만 웹을 통해 사용자들이 정보를 교환하고 스스로 커뮤니티를 만들어 교류하고자 하는 수요가 늘어나면서 게시판, 블로그 등과 같은 서버와 클라이언트 간의 상호작용을 하는 부분들이 생기기 시작했습니다.

전형적인 브라우저 렌더링 방식은 HTTP 요청에 대한 HTTP 응답을 받아서 브라우저의 화면을 모두 지우고 받은 내용을 새로 표시하는 방식이었습니다.

그때 Ajax와 같은 기술이 나타나면서 사용자와 긴밀히 상호작용하는 웹 서비스가 등장하였고 인기를 끌기 시작하였습니다.

다시 말해, 기존에는 서버와 클라이언트가 실시간으로 상호작용하는 웹 서비스를 개발하기 위해서 숨겨진 프레임을 이용하는 방법이나 Long Polling, Stream 등과 같은 다양한 방법을 사용했었습니다.

하지만 이 방식은 브라우저가 HTTP 요청을 보내고 웹 서버가 이 요청에 대한 HTTP 응답을 보내는 단방향의 메시지 교환 방식을 유지하는 선에서 구현된 방식입니다.

즉, 기존의 방법에 일종의 트릭을 사용한 방법입니다. 이 때문에 기존의 웹 기술을 이용하여 실시간 웹 서비스를 만드는 일은 복잡하고 어려웠습니다.

바로 이러한 불편함과 사용자와 긴밀히 상호작용하는 웹 페이지를 더 쉽게 만들고자 하는 개발자의 요구가 브라우저와 웹 서버 사이의 자유로운 양방향 메시지 송수신 방법으로써 HTML5 표준안의 일부인 웹소켓 API가 등장했습니다.

사용 방법은 Ajax와 비슷하지만, 개념 면에서 Ajax와 차이를 두고 있습니다.

Ajax의 경우는 웹 브라우저에서 데이터를 호출하면 웹 서버에서 호출된 값을 검색, 작성해서 웹 브라우저로 메세지를 보내는 형식의 구조라면,

웹소켓의 경우는 웹 브라우저에서 호출해서 데이터를 가져가는 기능을 포함하여 반대로 서버에서 클라이언트를 호출할 수 있는 기능까지 있습니다.

​예로 채팅프로그램을 만든다고 가정할 때, 우리가 채팅을 서버로 보내는 건 가능합니다.

그러나 Ajax로 만든 웹 페이지라면 서버 측에서 클라이언트가 보낼 수가 없습니다. 대응책으로 10초마다 데이터를 갱신해서 확인할 수 있지만,

대신, 웹소켓은 서버에서도 클라이언트를 인지하는 상태이기에 양방향 통신이 가능합니다.

HTML5 웹소켓은 매우 유용한 기술이지만, 브라우저별로 지원하는 웹소켓 버전이 다르며 오래된 브라우저의 경우 아예 지원하지 않습니다.

따라서 자바스크립트를 이용하여 브라우저에 상관없이 실시간 웹을 구현할 수 있는 Socket.io를 좀 더 많이 사용하고 있습니다.

WebSocket 사용의 어려운 점

WebSocket은 사용시 위에 서술한 것과 같은 장점들을 주지만 그에 못지 않는 비용을 지불해야 합니다.

아래는 WebSocket 사용 시 발생할 수 있는 어려운 점 또는 문제점들입니다.

프로그램 구현에 보다 많은 복잡성 초래 :

WebSocket은 HTTP와 달리 Stateful protocol이기 때문에 서버와 클라이언트 간의 연결을 항상 유지해야 하며 만약 바정상적으로 연결이 끊어졌을 때 적절하게 대응해야 합니다. 이는 기존의 HTTP 사용 시와 비교했을 때 코딩의 복잡성을 가중시키는 요인이 될 수 있습니다. 서버와 클라이언트 간의 Socket 연결을 유지한다는 것 자체가 비용이 드는 일입니다. 특히나 트래픽양이 많은 서버 같은 경우에는 CPU에 큰 부담이 될 수 있습니다. 오래된 버전의 웹 브라우저에서는 지원하지 않습니다. (물론 SockJS 라이브러리 같은 경우에는 Fallback option을 제공하고 있습니다.) 참고로 인터넷 익스플로어 같은 경우에는 10 버전부터 지원합니다. 서버와 클라이언트 간의 연결이 끊어졌을 때 생성되는 에러 메세지가 구체적이지 않아서 (예를 들어 여러가지 다른 이유로 연결이 끊어졌는데 에러 메세지가 같은 경우) 디버깅을 하는데 어려움이 많기도 합니다.

아무리 좋은 기술이라 할지라도 모든 경우에 유용할 수는 없는 법이기 때문에 프로그램에 꼭 필요한 기술인지 잘 체크하고 수용 여부를 결정하는 것이 바람직합니다.

대표적인 사용 예)

페이스북 같은 SNS 어플리케이션

LOL 같은 멀티플레이어 게임들

구글 Doc 같이 여러 명이 동시 접속해서 수정할 수 있는 Tool

클릭 동향 분석 데이터 어플 (특정 시간동안 어느 사이트에 주로 접속했는지 등의 정보를 파악하는 어플)

증권 거래 정보 사이트 및 어플

스포츠 업데이트 정보 사이트 및 어플

화상 채팅 어플

위치 기반 어플

온라인 교육 사이트 및 어플

HTTP 통신과 Socket 통신의 차이점

반응형

목표

Htttp 통신과 Socket 통신의 차이점을 이해한다.

HTTP 통신이란?

HTTP란 HyperText Transfer Protocol의 약자로 HTML 파일을 전송하는 프로토콜이라는 의미를 가진다. 웹브라우저에서 통신이 일어나며, 초기에는 HTML 파일을 전송하려는 목적으로 만들어졌으나 현재는 JSON, Image 파일 등 또한 전송한다.

HTTP 통신의 통신 방식

그림1. HTTP 통신

HTTP 통신은 클라이언트에서 서버로 요청을 보내고 서버가 응답하는 방식으로 통신이 이루어진다. 응답에는 클라이언트의 요청에 따른 결과를 반환한다. 이로 인해 다음과 같은 특성을 가진다.

클라이언트의 요청이 있을 때 서버가 응답하는 방식. 단방향 통신.

서버의 응답에는 응답 코드가 같이 전송되며, 사용자는 응답 코드와 메세지 응답으로부터 오는 메세지 바디를 통해 요청 값을 전달 받는다.

초기에는 서버는 응답한 후 클라이언트(사용자)의 Connection을 곧바로 끊어버렸으나, 최근에는 성능상의 이유(Connection을 맺고 끊는 비용이 비싸다)로 Keep Alive 옵션을 통해 일정 기간 동안 클라이언트와 Connection을 유지하는 방식으로 통신이 가능해졌다.

정리

HTTP 통신은 클라이언트의 요청이 있을 때 서버가 응답하는 단방향 통신이다.

JSON, Image, HTML 파일 등 다양한 파일을 전송 받을 수 있다.

응답을 받은 후 Connection이 끊어지는 것이 기본 동작이지만, 성능 상으로 필요하다면 Keep Alive 옵션을 주어 일정 시간 동안 Connection을 유지하는 것이 가능하다.

소켓 통신이란?

소켓이란 두 프로그램이 서로 데이터를 주고 받을 수 양쪽(두 프로그램 모두)에 생성되는 통신 단자이다.

그림2. 소켓 통신

소켓 통신이란 서버와 클라이언트 양방향 연결이 이루어지는 통신으로, 클라이언트도 서버로 요청을 보낼 수 있고 서버도 클라이언트로 요청을 보낼 수 있는 통신으로 다음과 같은 특성을 가진다.

클라이언트와 서버 양쪽에서 서로에게 데이터 전달을 하는 방식의 양방향 통신.

보통 스트리밍이나 실시간 채팅 등 실시간으로 데이터를 주고 받아야 하는 경우 Connection을 자주 맺고 끊는 HTTP 통신보다 소켓 통신이 적합하다. 소켓 통신은 계속해서 Connection을 들고 있기 때문에 HTTP 통신에 비해 많은 리소스가 소모된다.

정리

자주 데이터를 주고 받는 환경이 아닌 경우 HTTP 통신을 통해 받는 것이 유리하다.

자주 데이터를 주고 받아야 하는 환경에서는 소켓 통신이 유리하다.

HTTP 통신은 사용자가 서버에 요청을 보내는 단방향 통신인 반면, 소켓 통신은 양방향 통신이다.

반응형

WebSocket을 이용하여 클라이언트 애플리케이션 작성하기 – Web API

상단의 데이터 전송에 JSON 사용하기 에서 작업한 코드와 연관되는 클라이언트를 생각해 봅시다. 클라이언트에서 받을 수 있는 패킷들의 목록은 다음과 같을 것 입니다.:

위의 메세지들을 받아서 처리하는 코드는 아래와 같을 것 입니다.:

웹 소켓(WebSocket) 개념 이해

반응형

웹 소켓(WebSocket)

웹 소켓은 TCP 기반 소켓 API를 대체하기 위해 HTML5 사양의 TCP Connection에 처음 참조되었습니다. 2008년 6월 마이클 카터가 일련의 논의를 주도하여 웹 소켓이라는 프로토콜의 첫 번째 버전을 만들었습니다.

웹소켓 커넥션(WebSocket Connection)

WebSocket

웹 소켓은 TCP 연결에 완전한 이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜입니다. 웹 소켓 프로토콜은 2011 IETF에 의해 RFC 6455에서 표준화되었으며 현재 웹입니다. IDL의 웹 소켓 API는 W3C에 의해 표준화되었습니다.

웹 소켓은 HTTP와 다릅니다. 두 프로토콜은 모두 OSI 모델의 7번째 계층에 있으며, TCP의 4번째 계층에 의존하고 있지만 “RFCAcording to 6455, 웹 소켓은 HTTP 포트 80 및 443 이상으로 실행되도록 설계되었으며 HTTP 프록시 및 중간 계층을 지원하도록 설계되어 HTTP 프로토콜과 호환됩니다. 호환성을 달성하기 위해, 웹 소켓 핸드 셰이크는 HTTP 업그레이드 헤더를 사용하여 HTTP 프로토콜 내의 웹 소켓 프로토콜로 변경됩니다.

웹소켓 핸드셰이크(WebSocket Handshake)

웹 소켓 프로토콜은 웹 브라우저(또는 다른 클라이언트 애플리케이션)와 웹 서버 간의 통신을 허용하며, HTTP 풀과 같은 반 이중 모드에 비해 서버와의 실시간 데이터 전송을 쉽게 합니다. 이는 클라이언트가 요청하는 것이 아니라 서버가 클라이언트에 콘텐츠를 전송할 수 있는 표준화된 방법을 제공함으로써 가능해졌습니다. 또한, 연결이 유지되면 메시지를 통해 앞뒤로 이동할 수 있으며, 이러한 방식으로 클라이언트와 서버 간에 양방향 대화가 발생할 수 있습니다. 통신은 TCP 포트 80(443 TLS 암호화 연결용)을 통해 이루어지며 방화벽을 통해 웹이 아닌 인터넷 연결을 차단하는 여러 환경에서 유용합니다. 간단한 양방향 브라우저 서버 통신은 혜성 등 스톱 갭 기술을 사용하여 비표준 방식으로 작동합니다.

대부분 브라우저는 Google Chrome, Microsoft Edge, Internet Explorer, Firefox, Safari 및 Opera를 포함한 프로토콜을 지원합니다.

WebSocket 특징

HTTP와 달리 웹 소켓은 완전한 이중 통신을 사용하여 웹 소켓이 TCP에서 메시지를 스트리밍 할 수 있습니다. TCP는 메시지의 상속 개념 없이 바이트 스트림을 처리합니다. 웹 소켓 이전에는 포트 80의 완전한 이중 통신이 혜성 채널을 사용하여 실행 가능했습니다. 그러나 혜성 구현은 사소한 것이 아니며 TCP 핸드 셰이크 및 HTTP 헤더 로드로 인해 작은 메시지에서 비효율적입니다. 웹 소켓 프로토콜은 웹의 보안 문제를 손상하지 않고 이 문제를 해결하는 것을 목표로 합니다. 웹 소켓 프로토콜 사양은 Ws(WebSocket), ws(Websocket Secure)의 두 가지 새로운 통합 리소스 식별자 (URI) 체계를 기반으로 하며 이들은 각각 암호화되지 않은 연결 및 암호화된 연결에 사용됩니다.

프로토콜 핸드셰이크(Protocol Handshake)

웹 소켓을 연결하기 위해 클라이언트는 웹 소켓 핸드 셰이크 요청을 전송하고, 이렇게 함으로써 서버는 다음 예에서 보기 위해 웹 소켓 핸드 셰이크 응답을 반환합니다.

GET / HTTP/1.1 Host: server.example.com Upgrade: Websocket Connection: Upgrade Sec-WebSocket-Key: pCHJOMbDk5FzXkb9GIhXsw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://MY IP or DNS

<클라이언트 요청>

HTTP/1.1 101 Web Socket Protocol Upgrade: Websocket Connection: Upgrade Sec-WebSocket-Key: pXHGOMaDE5fzX4b1GwhLMwk= Sec-WebSocket-Protocol: chat

<서버 응답>

프록시 경유

웹 소켓 프로토콜 클라이언트 구현에서는 사용자 에이전트가 대상 호스트와 포트에 연결할 때 프록시를 사용하도록 구성되었는지 확인하려고 합니다. 만약 그렇다면 HTTPConfigure 영구 터널은 HTTP CONNECT 메소드를 사용하여 구성합니다.

웹 소켓 프로토콜 자체는 프록시 서버와 방화벽을 인식하지 않고 HTTP 호환 핸드셰이크 기능을 제공하여 HTTP 서버가 웹 소켓 게이트웨이 또는 서버와 기본 HTTP 및 HTTPS 포트(80 및 443)를 공유할 수 있게 합니다. 웹 소켓 프로토콜은 웹 소켓과 웹 소켓의 안전 연결을 나타내기 위해 각각 ws:// 및 ws:// 이니셜을 정의합니다. 이 두 가지 방식은 HTTP 업그레이드 메커니즘을 사용하여 웹 소켓 프로토콜로 업그레이드하며 일부 프록시 서버는 투명하고 웹 소켓과 잘 작동합니다. 다른 것들은 제대로 작동하지 못하고 연결되지 않습니다.

경우에 따라 추가 프록시 구성이 필요하며 웹 소켓을 지원하기 위해 특정 프록시 서버로의 업그레이드가 필요할 수 있습니다.

암호화되지 않은 웹 소켓 트래픽이 웹 소켓을 지원하지 않는 명시적 또는 투명한 프록시 서버를 통과하면 연결이 실패할 가능성이 있습니다.

암호화된 웹 소켓 연결을 사용할 때, HTTP는 브라우저가 명시적은 프록시 서버를 사용하도록 구성되었는지 확인하기 위해 전송 계층 보안(TLS)을 사용하는 데 사용됩니다. 이때 HTTP CONNECT 명령이 발급되었는지 보증하게 됩니다.

반응형

websocket, socket.io를 이용한 양방향 통신

const server = require ( ‘ http ‘ ). createServer (); const io = require ( ‘ socket.io ‘ )( server ); const clients = []; io . on ( ‘ connection ‘ , ( client ) => { clients . push ( client ); client . on ( ‘ message ‘ , ( message ) => { // handle message… client . forEach (( c ) => c . emit ( ‘ message ‘ , message )); }); client . on ( ‘ disconnect ‘ , () => { console . log ( ‘ client disconnect… ‘ , client . id ); // handle disconnect.. clients . filter (( c ) => c . id !== client . id ); }); client . on ( ‘ error ‘ , ( err ) => { console . log ( ‘ received error from client: ‘ , client . id ); // handle error.. }); }); server . listen ( 5000 , ( err ) => { if ( err ) throw err ; console . log ( ‘ listening on port 5000 ‘ ); });

키워드에 대한 정보 웹 소켓 통신

다음은 Bing에서 웹 소켓 통신 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 오늘의 테크용어 : 웹소켓이 뭐냐면

  • 웹소켓
  • websocket
  • nodejs
  • 노드
  • 웹서버
  • 채팅
  • 실시간

오늘의 #테크용어 #: #웹소켓이 #뭐냐면


YouTube에서 웹 소켓 통신 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 오늘의 테크용어 : 웹소켓이 뭐냐면 | 웹 소켓 통신, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment