WebRTC용 ECDSA - 보안 강화, 개인 정보 보호 강화, 성능 개선

Chrome 52부터 WebRTC는 인증서 (RTCCertificate) 생성을 위해 훨씬 더 효율적이고 안전한 알고리즘인 ECDSA를 사용합니다. 또한 이제 IndexedDB를 사용하여 RTCCertificates를 저장할 수 있습니다.

RTCCertificates는 WebRTC 피어 연결을 설정할 때 DTLS 핸드셰이크에 사용되는 자체 서명 인증서입니다. (DTLS는 WebRTC에서 사용하는 UDP와 같은 데이터그램 프로토콜용 암호화 프로토콜 TLS를 구현한 것입니다.)

최근까지 WebRTC는 인증서에 RSA-1024 키를 사용했습니다. 이러한 키에는 몇 가지 단점이 있습니다.

  • RSA-1024 키를 생성하면 통화 설정 시간에 최대 약 1,000ms가 추가될 수 있습니다.
  • 1024비트 RSA 키는 적절한 암호화 강도를 제공하지 않습니다.

RSA-1024에서는 인증서 생성이 느리기 때문에 일부 모바일 앱에서는 인증서를 미리 준비하거나 재사용하기도 했습니다.

키 강도 문제는 2048비트 RSA 키 이상으로 이동하여 해결할 수 있지만 이 경우 통화 설정이 몇 초 더 지연될 수 있습니다. Chrome 52에서는 RSA 키 크기를 변경하는 대신 인증서에 사용하기 위해 ECDSA 키 (타원 곡선 디지털 서명 알고리즘)를 구현합니다. 이 키는 3072비트 RSA 키만큼 강력하지만 수천 배 더 빠릅니다. ECDSA를 사용한 호출 설정 오버헤드는 단 몇 밀리초에 불과합니다.

전반적으로 ECDSA 키는 특히 모바일에서 향상된 보안, 개인 정보 보호, 실적 향상을 의미합니다. 이러한 이유로 ECDSA는 WebRTC 보안 아키텍처 초안에 의무화되었습니다.

Chrome 47부터 ECDSA를 선택할 수 있습니다.

// or webkitRTCPeerConnection
RTCPeerConnection.generateCertificate({
    name: "ECDSA",
    namedCurve: "P-256"
}).then(function(certificate) {
    var pc = new RTCPeerConnection({..., certificates: [certificate]});
});

Chrome 52부터는 ECDSA가 기본적으로 사용 설정되어 있지만 RSA 인증서를 생성하도록 선택할 수 있습니다.

pc.generateCertificate({
    name: "RSASSA-PKCS1-v1_5",
    modulusLength: 2048,
    publicExponent: new Uint8Array([1, 0, 1]),
    hash: "SHA-256"
})

generateCertificate()에 관한 자세한 내용은 W3C 초안을 참고하세요.

IndexedDB에 RTCCertificate 저장

Chrome 52의 또 다른 개선사항: WebRTC에서 사용하는 RTCCertificates를 IndexedDB 저장소에서 저장하고 로드할 수 있으므로 세션 간에 새 인증서를 생성할 필요가 없습니다. 이 방법은 예를 들어 RSA를 계속 사용해야 하고 RSA 생성 오버헤드를 피하려는 경우에 유용할 수 있습니다. ECDSA를 사용하면 매번 새 인증서를 생성하기에 충분히 빠르므로 캐싱이 필요하지 않습니다.

RTCCertificate IndexedDB 저장소는 이미 Firefox에서 제공되며 Opera 39에 있습니다.

자세히 알아보기