Tempo Di Valse

[Node.js] SSL 적용된 Websocket 통신 (wss://) 본문

개발/Web

[Node.js] SSL 적용된 Websocket 통신 (wss://)

TempoDiValse 2022. 4. 21. 17:37

HTML5 에서 WebSocket 이라는 개념이 나온 이후로 브라우저와 서버 사이에 소켓통신이 쉽게 이루어지게 되었는데, 이 부분은 꽤나 오래된 이야기라 패스하도록 한다.

 

서버환경이 일반 http 가 지원되는 환경에서 사용하게 되면 클라이언트와 소켓서버 연결을 아주 쉽게 구축할 수 있지만 SSL 이 적용된 서버라면 추가적인 옵션이 필요하다. 왜냐하면 SSL 을 적용한 것이 웹 서버에 브라우저에 접근하는 것을 적용을 한 것이지 소켓에 적용한 것은 아니기 때문이다. 그래서 에러를 발생시키는데, https 환경에서 http 데이터(예를 들어, 이미지 같은거) 를 불러오는 경우에 콘솔에는 Mixed Content 라고 써있는 에러를 밷는 것과 같은 느낌의 에러를 볼 수 있다.

 

그렇다면 https 환경에서 소켓서버와 연결하려면 어떻게 해야하는가에 대해서 빠르게 알아보도록 하겠다.


먼저, 서버에서 사용하고 있는 SSL 인증서의 위치를 알아본다.

 

보통의 Linux 서버에서는 '/etc/pki' 위치에 인증서를 넣거나 하는데 그건 서버마다 SSL 을 두었던 위치가 다르니 잘 찾아보길 바란다. 정 모르겠다 싶으면 Apache 나 Nginx 의 설정파일을 보면 찾을 수 있지 않을까 싶다.

 

인증서에는 "비공개 키" 와 "인증서 키" 그 외에 "체인 키" 들을 사용하게 되는데, 여기서는 "비공개 키" 와 "인증서 키" 를 사용한다.

 

다음, 비공개 키와 인증서 키의 위치를 알게 되었다면 소스를 작성해보도록 한다.

const fs = require('fs');

const cert = fs.readFileSync(${KEY_CERTIFICATE})
const key = fs.readFileSync(${KEY_PRIVATE})

 

 

단순하게 Node.js 의 fs 모듈을 통해 "인증서 키"와 "비공개 키"를 읽었다. 그 다음에 서버 정보 생성에 필요한 https 모듈을 초기화 할 때 위에서 불러왔던 "인증서 키" 와 "비공개 키" 를 전달한다.

 

마지막으로, Socket.io 라이브러리를 이용하여 편하게 WebSocket 을 구축하면 완료.

 

// ... 위에 로직

const server = require('https').createServer({ cert: cert, key: key })

const io = require('socket.io')(server);
io.on("connection", (client) => {
    // ...Codes
})
반응형
Comments