MQTT · 2026-04-19

MQTT WebSocket 보안: CORS와 토큰 인증 적용

브라우저 환경에서 MQTT over WebSocket 연결 시 CORS 문제와 토큰 기반 인증 흐름, 서버·프록시 설정 예시까지 정리한 기술 설명

작성일 : 2026-04-19 ㆍ 작성자 : 관리자
post
목차

개요

브라우저에서 MQTT를 WebSocket으로 사용할 때 보안 관련 설정은 필수다. 특히 CORS 이슈와 토큰 인증은 연결 안정성과 권한 관리를 좌우한다. 본문은 mqtt websocket cors 설정, websocket token auth mqtt, 브라우저 mqtt 보안 관점에서 단계별로 설명한다.

기본 개념 정리

MQTT over WebSocket

MQTT는 경량 메시지 프로토콜이다. 브라우저는 순수 TCP 소켓을 못 열므로 WebSocket을 통해 MQTT 브로커와 통신한다. 이때 브로커는 WebSocket 리스너를 활성화해야 한다.

CORS와 브라우저 제약

CORS는 브라우저가 다른 출처 리소스 접근을 제한하는 메커니즘이다. WebSocket 연결 시에도 프리플라이트나 헤더 정책 때문에 문제가 발생할 수 있다. 따라서 프록시 또는 서버에서 적절한 응답 헤더를 반환해야 브라우저에서 연결이 허용된다.

CORS 문제 이해

브라우저는 보안상 몇몇 헤더와 메소드를 제한한다. WebSocket은 Upgrade 요청으로 동작하므로 표준 HTTP 요청처럼 보이지만, 서버와 프록시가 Upgrade를 허용하지 않으면 연결이 실패한다. 또한 Authorization 헤더를 직접 설정하기 어려운 환경이 있어 우회 방식이 필요하다.

브로커와 프록시 구성 예시

Mosquitto에서 WebSocket 활성화

Mosquitto는 WebSocket 리스너를 지원한다. 간단한 설정 예시는 다음과 같다.

listener 9001
protocol websockets
# allow_anonymous false
# password_file /etc/mosquitto/passwd

Nginx를 리버스 프록시로 사용해 CORS 처리

브라우저 요청을 Nginx가 받아 CORS 헤더를 추가한 뒤 브로커로 포워딩하면 안정적이다. 다음은 최소 구성 예시다.

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 443 ssl;
    server_name mqtt.example.com;

    location /mqtt {
        proxy_pass http://127.0.0.1:9001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host;
        add_header Access-Control-Allow-Origin "https://app.example.com" always;
        add_header Access-Control-Allow-Credentials true always;
        add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;
        add_header Access-Control-Allow-Headers "Authorization, Content-Type" always;
    }
}

주의점

  • Access-Control-Allow-Origin을 와일드카드(*)로 하면 쿠키나 자격증명 전달이 차단될 수 있다.
  • SSL을 사용해 데이터 전송을 암호화하면 중간자 공격 위험이 낮아진다.

토큰 인증 적용 방식

브라우저 환경에서는 Authorization 헤더를 WebSocket 핸드셰이크에서 직접 설정하기 어렵다. 대안은 토큰을 쿼리 파라미터로 전달하거나, 프록시가 토큰을 검증하고 내부적으로 인증 헤더를 추가하는 방식이다.

쿼리 파라미터 방식

클라이언트가 연결 URL에 토큰을 붙이면 브로커 또는 프록시가 이를 확인한다. 보안상 토큰은 짧은 수명으로 발급하는 것이 좋다. 예:

wss://mqtt.example.com/mqtt?token=eyJhbGciOiJ...

프록시 기반 인증

Nginx에서 auth_request 또는 Lua 모듈을 이용해 토큰을 검사한 뒤 내부 요청으로만 브로커에 연결을 허용할 수 있다. 이렇게 하면 브로커에 민감한 인증 로직을 두지 않아도 된다.

location /mqtt {
    auth_request /auth;
    proxy_pass http://127.0.0.1:9001;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

location = /auth {
    internal;
    proxy_pass http://auth-server/verify;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-Original-URI $request_uri;
}

브라우저 클라이언트 예

MQTT.js를 사용하는 브라우저 예시다. 토큰을 쿼리 파라미터로 전달한다.

const token = 'eyJhbGciOi...';
const client = mqtt.connect('wss://mqtt.example.com/mqtt?token=' + token, {
  keepalive: 30,
  reconnectPeriod: 1000
});

client.on('connect', () => {
  console.log('connected');
  client.subscribe('device/+/status');
});

client.on('message', (topic, message) => {
  console.log(topic, message.toString());
});

테스트 및 검증

  • 브라우저 개발자 도구에서 Network 탭의 Upgrade 요청과 응답 헤더를 확인한다.
  • 프록시 로그와 브로커 로그를 동시에 확인해 인증 흐름을 추적한다.
  • 토큰 만료, 변조, 재사용 시나리오를 시뮬레이션해 보안 취약점을 점검한다.

결론

mqtt websocket cors 설정과 websocket token auth mqtt는 브라우저 mqtt 보안의 핵심이다. 프록시를 통한 CORS 처리와 중앙화된 토큰 검증으로 보안성과 운영 편의성을 동시에 확보할 수 있다. 구성 선택은 운영 환경과 위협 모델을 고려해 결정하는 것이 바람직하다.

mqtt websocket cors 설정 websocket token auth mqtt 브라우저 mqtt 보안 MQTT 보안 CORS 설정 JWT 인증 WebSocket 보안 Mosquitto Nginx