WebSocket, Gateway Interface, Channel Layer

⚠️ 안내: 이 글은 학습 기록용입니다. 오류나 보완 의견은 댓글로 알려주세요.

1. WebSocket

1-1. HTTP (HyperText Transfer Protocol)

  • HTTP는 웹에서 가장 기본이 되는 애플리케이션 계층 프로토콜
  • 브라우저(클라이언트)와 서버가 요청(Request) -> 응답(Response) 형태로 통신하도록 설계되어 있음
    • 클라이언트가 먼저 요청을 보낸다.
    • 서버는 그 요청에 대한 응답을 반환한다.
    • 연결은 요청 단위로 짧게 끝난다.
  • HTTP의 장단점:
구분내용
강점문서·리소스 조회, REST API 등 요청이 왔을 때만 처리하면 되는 구조에 적합
약점서버가 먼저 데이터를 보내야 하거나 연속적인 대화·실시간 스트리밍이 필요한 경우에 부적합

1-2. 실시간을 HTTP로 억지로 만들면: Polling

polling

출처: https://yong-nyong.tistory.com/90

  • 클라이언트의 요청 없이 서버가 먼저 응답을 보낼 수 없기 때문에 클라이언트가 주기적으로 서버에 요청을 보내는 방식
    • 클라이언츠가 일정 주기(예: 1초마다)로 서버에 요청을 보냄
    • 서버는 “새로운 데이터가 있든 없든” 응답을 반환
  • 서버 리소스 낭비 및 네트워크 비용 증가
    • 데이터가 없을 때도 요청이 계속 발생 -> 불필요한 트래픽
    • 요청은 곧 비용(서버 처리/네트워크/로드밸런서/로그)
  • long polling 등 보완 기법이 존재하지만 구조적 한계는 유지
    • 클라이언트가 요청을 보냄
    • 서버는 바로 응답하지 않고 대기
    • 새로운 이벤트가 생기면 그 때 응답 (일정시간동안 이벤트가 없는 경우 타임아웃으로 응답)
    • 클라이언트는 응답을 받자마자 다시 요청을 보냄
  • long polling은 연결을 오래 잡고 있어야 하므로 동시 접속자 수가 많으면 서버/프록시 자원의 부담이 증가

1-3. WebSocket: 실시간 위한 프로토콜

websocket

출처: https://yong-nyong.tistory.com/90

  • WebSocket은 프로토콜의 한 종류로 HTTP와 마찬가지로 네트워크 상에서 통신 규칙을 정의
  • 실시간을 위해 설계된 프로토콜
    • HTTP처럼 요청-응답을 반복하는 대신 **한 번 연결을 수립(Handshake) 한 뒤, 연결을 끊지 않고 데이터를 주고 받는 방식 즉, **한 번 연결되면 연결을 끊지 않고 데이터를 계속 주고받을 수 있다.**

WebSocket이 제공하는 통신 특성

  • 지속 연결(Persistent Connection): 연결을 매번 새로 만드는 대신 “대화 채널”을 유지
  • 양방향(Full-Duplex): 클라이언트도 서버도 서로 먼저 메시지를 보낼 수 있음
  • 서버 Push가 기본값: 이벤트가 생기면 서버가 즉시 전달 가능
  • 실시간 UX에 적합한 메시지 모델: “요청/응답”이 아니라 “메시지/이벤트” 중심

Handshake (HTTP Upgrade)

WebSocket은 처음부터 완전히 새로운 네트워크가 아니라, 웹 생태계(브라우저, 프록시, 방화벽)를 통과하기 위해 HTTP 업그레이드 방식 을 사용한다.

  • 클라이언트는 HTTP 요청을 통해 WebSocket 업그레이드 시도
  • 요청 헤더에 다음 정보를 포함
    • Upgrade: websocket
    • Connection: Upgrade
  • 서버가 이를 수락하면 HTTP 101 Switching Protocols 응답 반환
  • 이후 HTTP → WebSocket 프로토콜로 전환

👉 이 과정을 Handshake라고 함

2. Gateway Interface

2-1. Server Gateway Interface(SGI)란?

wsgi

  • 웹 서버와 웹 애플리케이션이 어떻게 통신하는지 정의한 표준 규약
  • HTML, CSS, JS, 이미지, 동영상 같이 동적 파일(static files)은 웹서버(Nginx)에서 처리
  • 애플리케이션의 데이터베이스 쿼리, API처리, Websocket 통과 같은 동적 요청(Dynamic Requests)는 WSGI/ASGI 서버에서 처리

2-2. WSGI vs ASGI

구분WGIASGI
정의Web Server Gateway InterfaceAsynchronous Server Gateway Interface
Django 실행 방식전통적인 실행 방식차세대 실행 인터페이스
처리 모델동기(Synchronous)비동기(Asynchronous)
지원 프로토콜HTTP 전용HTTP, WebSocket, 기타 비동기 프로토콜
연결 처리 방식요청당 처리, 블로킹 구조이벤트 루프 기반 다중 연결 처리
WebSocket 지원❌ 불가✅ 가능
실시간 서비스❌ 부적합✅ 적합
확장성요청 증가 시 제한적대규모·실시간 서비스에 유리
대표 사용 사례REST API, 서버 렌더링실시간 채팅, 스트리밍, 알림 시스템

3. Channel Layer

3-1. Channel Layer란?

channel_layer

  • Channel Layer는 실시간 애플리케이션에서 서버 내부에 고립된 연결들을 논리적으로 연결하기 위한 메시지 전달 추상화 계층
  • 실제 클라이언트는 서버랑 일대일로 통신하고, 서버랑 통신한 내용은 다른 WebSocket들이 알 수 없음
    • 서버 A에 연결된 클라이언트는 서버 B의 클라이언트와 직접 통신 불가
  • 즉, 각각 따로 동작하는 WebSocket 연결들이 메시지를 주고받을 수 있게 해주는 공용 메시지 통로 같은 것
    • WebSocket의 연결 자체를 관리하는 것은 아님
    • 메시지를 어디로, 누구에게 전달할지에 대한 규칙만 정의
      • 구현 기술은 아니고 개념적 계층(인터페이스)임

3-2. 메시지 브로커

  • Channel Layer가 요구하는 기능을 실제로 수행하는 존재
  • 메시지를 중간에서 받아서 서버 간 전달
  • Redis를 메시지 브로커로 사용할 수도 있음

© 2024. All rights reserved.

Powered by Hydejack v9.2.1