구리

[오류 해결] postman에서 연결되던 WebSocket 서버가 브라우저와는 연결되지 않는다? 본문

오류해결

[오류 해결] postman에서 연결되던 WebSocket 서버가 브라우저와는 연결되지 않는다?

guriguriguri 2025. 3. 19. 12:58

이슈

현재 개발 중인 서비스는 트랜스코딩 진행률 알림을 위해 socket.io를 사용하고 있었다. 그러나 유지보수가 어려워 WebSocket으로 된 새로운 push 알림 서버가 개발되었다. 그래서 나는 기존 소켓 연결 로직을 socket.io에서 WebSocekt (web api), 변경된 도메인으로 업데이트했다. 그런데 테스트를 하니 postman에선 잘 연결되던 소켓 도메인이 브라우저에서는 바로 끊겼다. (연결 시도시 바로 끊김)

WebSocket close이벤트 로그를 봐도 원인이 뭔지 자세히 알 수 없었다. code가 단지 1006 (비정상적인 연결 해제)라는 힌트말고는 큰 수확은 없었다...

해결

1. wireshark로 패킷 분석

브라우저가 실제로 연결 요청을 보내는지 알기 위해 wireshark를 통해 네트워크 패킷을 확인했다.

참고로 WebSocket은 wss(tls) 암호화 통신이라 wireshark상에서 일부 통신이 안보일 수 있기에 아래 링크를 참고해 설정한다.

https://knowledgebase.paloaltonetworks.com/KCSArticleDetail?id=kA14u000000oM2ECAU&lang=ko

 

macOS에서 Chrome 또는 Firefox와 Wireshark를 사용하여 SSL 해독하는 방법

macOS에서 Chrome 또는 Firefox와 Wireshark를 사용하여 SSL 해독하는 방법 31711 Created On 04/27/21 00:18 AM - Last Modified 01/03/25 15:25 PM ObjectiveChrome이나 Firefox에서 암호화된 웹 브라우징이나 기타 웹 애플리케이

knowledgebase.paloaltonetworks.com

실제로 WebSocket 서버로 패킷을 보내고는 있었다. 그런데 연결 시도시 바로 끊어지는 것을 확인했다. (FIN, ACK)

WebSocket 연결시 wss 프로토콜을 사용하고 있었기에 ssl 인증서가 유효한지 확인했다. https 기반 통신으로 ssl/tls를 사용해 암호화되기에 인증서에 문제가 있다면 브라우저에서만 연결 실패가 되는 것도 일리가 있었다. (postman에서는 인증서에 대해 신경쓰지 않기 때문이다.)

그래서 해당 서버의 url에 접속해 개발자 도구로 ssl 인증서 상태를 확인해봤다.

2. 개발자 도구로 ssl 인증서 상태 확인

오른쪽 사진은 정상적인 ssl 인증서가 있을 경우다. 왼쪽은 WebSocket 서버로 인증서가 등록되지 않은 것 같았다. 그래서 더 정확한 확인을 위해 openssl 명령어를 통해 SSL 인증서를 확인해봤다.

3. openssl로 SSL 인증서 검증

아래 명령어로 인증서 확인시 문제가 있는 해당 서버에서만 가짜 인증서인 Kubernetes Ingress Controller Fake Certificate가 표시되었다.  따라서 인프라 담당자분께 요청해 ssl 인증서를 추가했다. 사내에서는 namespace를 기준으로 서비스를 분리해둔 상태라 namespace를 추가할 때마다 ssl 인증서 작업도 같이 해야 했는데 그 과정이 누락된 것 같았다.

openssl s_client -connect websocket-url:443

# 결과 (대충 이런 식이었다)
Certificate chain
 0 s:CN = Kubernetes Ingress Controller Fake Certificate
 i:CN = Kubernetes Ingress Controller Fake Certificate
...
verify error:num=18:self signed certificate

 

다행히 인증서 작업이 완료된 후 WebSocket 서버와의 연결이 잘 됐다.