2010-04-23 8 views
28

웹 소켓 연결을 사용할 때 사용자를 인증하는 방법은 무엇입니까?웹 소켓 인증

예제 시나리오 : 암호화 된 웹 소켓 연결을 통한 웹 기반 다중 사용자 채팅 응용 프로그램입니다. 이 응용 프로그램의 각 연결이 특정 인증 된 사용자에게 속하고 연결 중에 허위 사용자 가장에 의해 악용 될 수 없음을 보장 (또는 보장)하려면 어떻게해야합니까?

답변

3

SSL/TLS는 X.509 인증서를 사용하여 클라이언트와 서버를 인증하는 데 사용할 수 있습니다. 사용중인 웹 응용 프로그램 플랫폼에 따라 다릅니다. 아파치에서 SSL_CLIENT_CERT environment variable은 유효한 알려진 인증서 목록과의 유효성을 검사 할 수 있습니다. 이렇게하면 전체 PKI를 사용할 필요가 없으며 각 클라이언트에 대한 인증서를 구입할 필요가 없습니다. CA를 사용하여 서버의 SSL 인증서를 백업하는 것이 좋습니다.

+0

SSL 인증서가 HTTP와 WebSocket 연결에 각각 사용된다는 의미입니까? – yojimbo87

+0

나는 루크가 말한 것에 동의하지 않습니다. SSL/TLS는 전송 계층에서 데이터가 변경되지 않도록 보장합니다. 하지만 여기서 문제는 웹 소켓 요청이 사용자 A가 아닌 사용자 B라는 것을 어떻게 알 수 있습니까? 이미지 A와 B가 모두 로그인되어 있습니다. 웹 소켓은 연결이 설정된 후 쿠키를 보내지 않으므로. 따라서 나중에이 웹 양말은 요청이 사용자 B가 아닌 실제 사용자 A의 것인지 확인합니다. –

41

앱의 웹 소켓이 아닌 부분에 대한 인증을 이미 수행중인 경우 연결 한 후 첫 번째 메시지로 세션 쿠키를 전달하고 정상적으로 쿠키를 확인하십시오.

경고 :
당신이 socket.io를 사용하는 경우, 그것은 더 쉽게 - 더의 쿠키가 연결을 자동으로 통과하고 액세스 할 수 있습니다 : 다음 flashsockets가 사용되는 경우 작동하지 않습니다 지적되어 있어요

var io = require('socket.io'); 
var socket = io.listen(app); 
socket.on('connection', function(client){ 
    cookies = client.headers['cookie']; 
}); 
+4

이것이 항상 작동 할 것이라 확신합니까? 예를 들어, Socket.IO가 플래시 소켓으로 떨어지면 브라우저 쿠키가 전송되지 않습니다 (AFAIK). – Thomas

+1

@ 토마스 당신 말이 맞아요, 대신에 첫 번째 메시지를 통해 인증을해야한다고 언급 한 [issue filed] (https://github.com/LearnBoost/socket.io/issues/101)가 있습니다. –

+1

실용적인 방법이지만 로그인 (및 쿠키 설정)이 WebSocket과 동일한 출처에서 오는 웹 페이지가 필요합니다. 그렇지 않으면 쿠키 (로그인 페이지에서 설정)가 WebSocket 연결. – oberstet