프론트 개발자를 위한 여정

모든 영역을 안내하는 개발자

Frontend

HTTP 통신과 웹소켓(WebSocket)의 차이 / REST API를 웹 소켓으로 구현했을 때

ji-frontdev 2024. 11. 26. 18:10
반응형

HTTP 통신

  1. 프로토콜 특징
    • 클라이언트-서버 간 요청/응답(Request/Response) 기반.
    • 클라이언트가 요청을 보내야 서버가 응답을 반환.
    • 단방향 통신(One-way) 구조.
  2. 장점
    • REST API와 잘 어울림: HTTP 메서드(GET, POST, PUT, DELETE 등)를 활용해 명확한 리소스 제어 가능.
    • 표준화: 대부분의 브라우저와 서버에서 기본적으로 지원.
    • 캐싱 가능: HTTP 헤더를 통해 캐싱을 관리할 수 있어 성능 최적화가 용이.
    • 보안: HTTPS를 통해 SSL/TLS 암호화를 쉽게 구현.
  3. 단점
    • 실시간 통신에는 비효율적: 클라이언트가 정기적으로 요청(Polling)하거나, 서버 푸시(SSE)와 같은 우회 방식이 필요.
    • 오버헤드: 요청마다 헤더와 데이터를 전송, 추가적인 트래픽 발생.

웹소켓(WebSocket)

  1. 프로토콜 특징
    • 클라이언트와 서버 간 양방향 통신(Full-duplex) 지원.
    • 한 번 연결이 설정되면 지속적으로 데이터를 주고받을 수 있음.
    • HTTP 핸드셰이크 이후 TCP 연결을 유지해 통신.
  2. 장점
    • 실시간 데이터 전송에 적합: 채팅, 게임, 알림, 실시간 주식 데이터 등.
    • 오버헤드 감소: 초기 핸드셰이크 이후 지속 연결로 데이터 크기를 최소화.
    • 이벤트 기반 처리: 서버가 클라이언트로 데이터를 즉시 전송 가능(Push).
  3. 단점
    • 구현 복잡도: HTTP보다 구현과 관리가 더 복잡.
    • 연결 유지 비용: 클라이언트와의 연결을 지속적으로 유지하므로 서버 리소스 부담.
    • 캐싱 불가능: 정적 데이터 서비스에 부적합.

HTTP 통신과 웹소켓 비교

특징HTTPWebSocket

통신 방식 요청/응답 (단방향) 양방향 (Full-duplex)
실시간 처리 비효율적 (Polling/SSE) 효율적
오버헤드 요청마다 발생 초기 연결 후 최소화
연결 상태 요청마다 새로운 연결 연결 유지
사용 사례 REST API, 파일 다운로드 채팅, 실시간 알림, 게임

REST API와 HTTP/웹소켓 선택 기준

  1. HTTP 통신을 선택하는 경우
    • 데이터를 요청하고 그 결과를 받는 구조(예: 데이터 조회, 생성, 업데이트, 삭제).
    • 통신이 비실시간으로 이루어질 때.
    • 클라이언트가 데이터를 직접 요청해야 할 때.
    • 캐싱이 중요한 경우(예: 정적 데이터).
  2. 웹소켓을 선택하는 경우
    • 실시간 데이터 업데이트가 필요한 경우(예: 채팅, 알림, 실시간 피드).
    • 서버에서 클라이언트로 데이터를 푸시해야 하는 경우.
    • 지속적으로 클라이언트와 연결을 유지해야 하는 경우.

 


 

REST API를 웹소켓(WebSocket)으로 구현할 때의 장점과 단점은 기존 HTTP 기반 REST API와의 비교에서 도출됩니다. REST API의 구조적 특성과 웹소켓의 지속적 연결 및 양방향 통신 특성이 결합되면서 생기는 특유의 이점과 한계가 있습니다.

 

장점

  1. 실시간 데이터 전달
    • 웹소켓은 양방향 통신이 가능하므로, 서버에서 변경 사항이 발생할 때 클라이언트로 **즉시 알림(Push)**을 보낼 수 있습니다.
    • 실시간 알림, 채팅, 주식 데이터, 게임 등 실시간성이 중요한 서비스에서 REST API를 활용한 구현이 효율적입니다.
  2. 오버헤드 감소
    • HTTP 기반 REST API는 요청마다 헤더 정보(메타데이터 포함)를 보내지만, 웹소켓은 초기 핸드셰이크 이후 연결을 유지하므로 데이터 패킷 크기가 작아집니다.
    • 반복적인 요청이 필요한 경우 네트워크 트래픽이 감소하여 성능이 향상됩니다.
  3. 효율적인 상태 유지
    • 웹소켓은 연결 상태를 유지하므로, 클라이언트와 서버 간 연속적인 상태 관리가 가능합니다.
    • 예: 클라이언트가 특정 리소스에 대해 구독(subscribe) 상태를 유지하며 업데이트를 받을 수 있음.
  4. 다중 클라이언트 지원
    • 서버에서 여러 클라이언트로 동시에 데이터를 전송하는 브로드캐스트멀티캐스트 구현이 용이합니다.
    • 예: 특정 이벤트를 모든 구독자에게 동시에 전달.

단점

  1. 구현 복잡성 증가
    • REST API의 특성인 리소스 중심 설계와 **HTTP 메서드(GET, POST 등)**의 직관성을 웹소켓에서 구현하기 어렵습니다.
    • 예를 들어, REST의 각 메서드에 맞는 요청과 응답 패턴을 웹소켓으로 설계하려면 추가적인 프로토콜 정의가 필요합니다.
  2. 보안 관리 복잡성
    • 웹소켓은 HTTP와 달리 헤더를 항상 포함하지 않으므로, 인증 및 권한 관리(예: 토큰 인증, 세션 관리)가 더 까다로울 수 있습니다.
    • 보안 프로토콜(예: WSS)을 사용해야 하지만 HTTPS만큼 표준화된 접근법이 부족합니다.
  3. 리소스 소비 증가
    • 웹소켓은 연결을 지속적으로 유지하므로, 클라이언트 수가 많아지면 서버의 리소스(CPU, 메모리, 연결 수)가 크게 소모됩니다.
    • 특히 대규모 서비스에서는 서버 스케일링 및 부하 분산 전략이 필수적입니다.
  4. HTTP 표준 기능 활용 불가
    • HTTP에서 제공하는 캐싱, 상태 코드, 콘텐츠 네고시에이션 같은 기능을 웹소켓에서는 기본적으로 사용할 수 없습니다.
    • 캐싱이 중요한 경우 별도의 구현이 필요합니다.
  5. 디버깅 및 테스트 어려움
    • HTTP 기반 API는 다양한 툴(Postman, cURL 등)을 통해 쉽게 테스트 가능하지만, 웹소켓은 이에 비해 디버깅 및 테스트가 더 어렵습니다.

웹소켓으로 REST API 구현 시 고려해야 할 점

  1. 프로토콜 설계
    • REST의 HTTP 메서드처럼, 요청과 응답의 타입과 구조를 정의해야 함.
    • 예: JSON 기반으로 action 필드를 추가해 명령(GET, POST, PUT 등)을 구분.
    • json
      코드 복사
      { "action": "get", "resource": "/users", "parameters": { "id": 123 } }
  2. 구독/알림 관리
    • 특정 리소스에 대한 구독 기능을 구현해야 실시간 데이터를 효과적으로 전달할 수 있음.
  3. 스케일링 전략
    • 대규모 트래픽을 처리하기 위해 클러스터링(WebSocket 서버 확장)과 연결 관리(Idle Timeout 등)를 고려해야 함.

REST API를 웹소켓으로 구현하는 사례

사용 예제

  • 실시간 채팅 애플리케이션: REST API로 초기 메시지 목록을 가져오고, 웹소켓으로 새 메시지를 실시간 전달.
  • 실시간 데이터 대시보드: 클라이언트가 REST API를 통해 대시보드 초기 데이터를 가져온 뒤, 웹소켓을 통해 업데이트를 수신.

혼합 모델 활용

  • HTTP REST API와 웹소켓을 혼합해 사용:
    • 정적 데이터는 REST API로 제공.
    • 실시간 업데이트나 이벤트 기반 데이터는 웹소켓으로 제공.

결론

REST API를 웹소켓으로 구현하면 실시간성효율성에서 강점을 가지지만, 복잡도 증가리소스 관리 문제가 단점으로 작용합니다. 특정 서비스 요구사항(예: 실시간 업데이트의 필요성)에 따라 HTTP 기반 REST API와 웹소켓을 상황에 맞게 조합하여 사용하는 것이 가장 적합한 접근법입니다.

반응형