2017-11-21 14 views
0

으로 설정되어 있습니다. 내가 일하는 회사의 보안 부서가 socket.io 요청에 대해 (올바르게) Access-Control-Allow-Origin: *을 거부합니다.socket.io CORS 액세스 제어 허용 원점이 *

응용 프로그램이 CORS를 전혀 사용하지 않고 있는데, 이것은 socket.io 요청에만 문제가 있습니다.

내가 서버가 준비 후 socket.io 시작하는 데 사용하고있는 기능입니다 :

exports.start = (server) => { 
    io = exports.socketio.socket.listen(server, { 
     origins: `https://${server.address().address}:*`, 
     rejectUnauthorized: false, 
     wsEngine: 'ws', 
     transports: ['websocket', 'polling'] 
    }); 

    exports.connect(); 
}; 

그게 문제는 처음이다 : -이 :: 같은 server.address().address 반환 뭔가 - 내가 필요 다른 주소 여러 서버에 응용 프로그램을 배포 - 이전이 더 origins 속성이 없었고 socket.io가 *

에 origing을 설정했다 - 내 로컬 컴퓨터에서 솔루션을 테스트 할 때 origins to: 'https://localhost:3000' 일부 socket.io 요청에 대해 여전히 Access-Controll-Allow-Origin: *이 발생합니다.

enter image description here

누군가는 이미이 문제가 발생 했습니까?

많은 자동화 server.address().address

답변

0

문제를 감사 어떤 도움이 공용 IP 주소가 같은 부하 분산 또는 프록시 또는 뭔가 할 수 있기 때문에 생산에 서버가 실제 공개 서버 주소를보고하지 않을 수 있다는 것입니다 기원 필드에 있어야하는 공용 IP 주소 (브라우저가 연결하는 주소)입니다. 서버 자체는 도메인과 공개적으로 연결된 것과 다른 IP 주소를 가질 수 있습니다.

socket.io에서 CORS 문제는 기본적으로 socket.io가 기본적으로 http 폴링을 사용하고 실제 webSocket으로 전환하기 때문에 발생합니다. webSocket 연결 자체는 CORS 제한을받지 않습니다. 따라서 클라이언트를 실제 webSocket과 만 연결하도록 구성하면 CORS 문제가 전혀 발생하지 않습니다.

당신은 여기 WebSocket을 사용하는 방법을 볼 수 있습니다 Socket.io 1.x: use WebSockets only?

나는 그것에 대해 알고있는 유일한 단점은 socket.io 연결이 아직 WebSocket을 지원하지 않는 이전 브라우저에서 작동하지 않을 것입니다. 의미있는 양으로 여전히 사용중인 브라우저의 경우 IE11 이전 버전의 IE는 2.5 % 정도 밖에되지 않습니다. 어떤 사람들은 IE8을 여전히 사용하는 사람들이 인터넷에 정통한 사용자가 적거나 통제가 엄격한 회사에 속해 있고 새로운 인터넷 서비스에 참여할 가능성이 적기 때문에 새로운 인터넷 서비스와의 관련성이 2.5 % 미만이라고 주장합니다.

궁금한 점이 있다면 2016 년 1 월 Microsoft는 IE11 이전 버전의 IE를 지원하는 것을 중단하고 모든 날짜가 지났다고 발표했습니다. 따라서 이전 버전의 IE에 대한 일반 버그 수정이 더 이상 없었습니다.).


대안은 서버가 CORS 사용해야합니다 공용 IP 주소 또는 도메인을 추가 할 수 있습니다 서버를 구축한다 누구에게나 시작할 때 읽는 설정 파일을 생성하는 것입니다.

+0

답변 해 주셔서 감사합니다. 답변에 언급 된 해결책을 시도했지만 작동하지 못했습니다. socket.io 버전 2.0.4를 사용하고 있습니다. 'websocket'을 전송 수단으로 사용하도록 설정해도 시작시 '폴링'요청을 보내지 못하게하지 않았습니다. (아마 내가 아직 가지 않았던 일부 설정 옵션). 'origins' 옵션에 대해서도 소켓 서버와 소켓 서버에 IP 주소를 하드 코드했는데 여전히 Access-Control-Allow-Origin을 설정했습니다. 로드 밸런서 또는 프록시 때문에 AWS에서 호스팅합니다. – matewilk