-
Notifications
You must be signed in to change notification settings - Fork 0
소켓 아이고 😇 (Feat. socket.io는 파싱을 해)
FE를 향한 배려가 삽질의 구렁텅이로 빠진 건에 대하여,,,
#socket.io
#host_파싱
#default_path
P2P 통신을 위한 시그널링 서버를 구축하는 과정에서 웹소켓 요청이 시그널링 서버로 전달되지 않는 문제가 발생했다.
아이너리 한 것은 WAS와 시그널링 서버 모두 웹소켓을 사용하고 있는데 오직 시그널링 서버로의 소켓 요청만 동작하지 않았다. 😇
결론부터 말하자면 이는 상대적으로 업무가 많은 FE분들의 라우팅 부담을 덜어고자 하는 노력에서 시작되었다. nginx의 경로 기반 라우팅으로 URL의 마지막에 /signal
을 붙이면 시그널링 서버로 전달해주겠다고 했는데, 경로를 붙이면서 소켓 요청을 이상한 곳으로 보내게 되었다. (우주먼지가 되어버린 소켓 요청)
개발자 도구를 열면 상상도 못한 URL이 있다. io
는 서버와 통신하기 위해 사용하는 객체인데, /signal
이라는 path가 사라지고 /socket.io
가 그 자리를 대체한 것을 볼 수 있다.
io
객체는 파라미터로 URL을 전달할 수 있는데, 놀랍게도 socket.io가 파라미터로 넣어준 URL을 자동으로 파싱하여 호스트 주소만 남겨버린다 😇 즉, 라우팅을 위해 붙여준 /signal
이 사라진 상태로 웹소켓 연결을 시도한다.
그렇다면 내가 붙여준 적도 없는 /socket.io
는 뭘까? 바로 socket.io의 기본 path다. io
의 파라미터에는 url
도 있지만 옵션도 파라미터로 넘길 수 있다.
호스트만 남은 URL에 path를 붙여주기 위해서는 바로 옵션을 활용해야 한다. 다음과 같이 path를 작성하면 /socket.io
대신 /signal
이 붙어서 간다.
io("https://was.tarotmilktea.com", { path: "/signal" });
위와 같이 클라이언트, 서버 측 path 처리를 해주면 소켓이 연결된다.
WAS 요청은 동작하고, 시그널링 서버는 동작하지 않았던 이유를 표로 정리해봤다.
- | WAS | wrong 시그널링 | correct 시그널링 |
---|---|---|---|
URL | https://was.tarotmilkteam.com |
https://was.tarotmilktea.com/signal |
https://was.tarotmilktea.com |
option 설정 | x | x | { path: "/signal" } |
path 결과 | /socket.io |
/socket.io |
/path |
실제 URL | wss://was.tarotmilktea.com/socket.io |
wss://was.tarotmilktea.com/socket.io |
wss://was.tarotmilktea.com/signal |
아래 그림은 이해를 돕고자 만들어본 io
요청 동작 과정이다.
Authored by @kimyu0218
🔮 타로밀크티
💻 프로젝트
- 📒 정적 파일 public vs src/assets
- 📒 카카오톡 공유
- 📒 인터랙티브 웹 구현
- 📒 반응형 웹 - 단위를 적절하게 사용하기
- 🪲 vite에서 tailwindcss 적용 이슈
- 🪲 tailwind의 장단점
- 📒 NCP 인프라 구축하기
- 📒 GitHub Actions로 CI/CD 자동화하기
- 📒 SSL 인증서 발급받기
- 📒 블루/그린 무중단 배포 구현하기
- 📒 graceful shutdown으로 사용자 경험 저하 방지하기
- 📒 winston과 sentry로 서버가 터지는 이유 분석하기 (+ slack webhook)
- 📒 카카오 로그인 도입하기
- 📒 health check로 서버 상태 확인하기
- 📒 Jest와 Supertest로 코드 동작 테스트하기
- 📒 도커 캐싱으로 빌드시간 67% 개선하기
- 📒 데이터베이스 최적화하기
- 🪲 521 Web server is down
- 🪲 도커 컨테이너에서 호스트 MySQL에 접근 못하는 이슈