작성한 대로, 일반 웹과 구글 플레이스토어 에서는 모든 기능이 순조롭게 잘 작동하기에 오류 메세지가 존재하지 않고, 토스에 제출했더니 오류가 발생한다고 심사 거부사유에 적혀있는데 정작 저는 토스서버의 백엔드 로그를 확인할 길이 없으니 오류가 발생했다는 주장만 볼 수 있고, 제 웹사이트에서는 아무 오류 없이 너무 잘 작동하고 있음에도 심사는 통과 안되는 상황입니다. 저와 친구들은 다 잘 플레이하고 있는데 도대체 왜 토스 서버에서는 안되는 건지ㅠ 공모전 마감일은 다가오고 답답하네요…
다른 문제인 것 같습니다. 로컬에서만 잘 되는게 아니라 웹서버로 배포후에도 잘 됩니다. CORS origin도 * 으로 열어뒀기에 토스가 다른 웹서버와는 다른 문제를 가지고 있는것 같습니다. socket.io 뿐만 아니라, 토스에서는 기존 웹서버에서 잘 되던 db 연결조차 안되고 있습니다.
현재 소켓 서버 주소는 항상 코드에 문자열로 하드코딩되는 게 아니라, 앱이 실행 중인 origin을 기준으로 자동 결정됩니다.
그래서 컴파일된 코드에 https://example.com이 보이지 않고 서비스하는 서버의 document origin 을 기준으로 연결되어 서비스 되고 있습니다.
서버 코드 (Node.js)
import { Server } from "socket.io";
const io = new Server(ENV_PORT);
io.on("connection", (socket) => {
console.log("connected:", socket.id);
socket.on("ping", () => {
socket.emit("pong");
});
});
여기서 코드에 mydomain이 없는데 어떻게 mydomain에 연결이 되는지 설명해주실 수 있을까요?
미니앱 환경은 귀사에서 운영하는 서버와 클라이언트가 한 위치에 있는 것이 아닌 토스에서 호스팅하는 환경에서 클라이언트가 별도로 동작합니다. 즉 서버의 호스팅 위치와 클라이언트의 호스팅 위치가 다르므로 제가 말씀드린 것처럼 명시적으로 서버 주소를 io의 인자값으로 넣어주셔야 정상적으로 동작할거 같아요.
이때 해당 도메인은 static resource만 전달하는 클라이언트 주소이며, 말씀 주신대로 url 인자 없이 io 객체를 만드는 경우 window.location.origin으로 처리되므로 socket connection이 정상적으로 처리되지 않습니다.
기존에 안드로이드 앱으로 배포하신 경우 mydomain.com 주소로 server와 client를 self serving하시는 구조였기 때문에 제어권이 귀사에 있다면 말씀주신대로 mydomain.com에서 클라이언트와 서버가 둘다 접속 가능하므로 성공적으로 동작할 수도 있지만, 미니앱의 경우 토스 미니앱 환경의 주소 체계를 따르는 분리된 구조이므로 제가 말씀드린 것처럼 io의 인자에 연결하는 서버 주소를 포함하셔야 하는 것이 맞습니다.