AWS/Elastic Beanstalk
AWS 도메인 연결과 SSL 연동 후 웹소켓 에러
Dev갱이
2024. 8. 19. 17:45
728x90
Mixed Content: The page at '<URL>' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint
도메인과 SSL연결까지 완료하고 해당 에러가 발생 한다면 http 요청을 보내는 리소스들이 없는지 확인하라. 그것들을 다 https로 변경 해준다.
- 카카오 Oauth2 콜백 URL
- 네이버 Oaurh2 콜백 URL
- 구글 Oauth2 콜백 URL
- 프론트에서 백엔드에 요청하는 ur
nginx conf
upstream frontend {
server frontend:3000;
}
upstream backend {
server backend:5001;
}
server {
listen 80; # SSL 종료는 로드 밸런서에서 처리하므로 HTTP로만 처리
location / {
proxy_pass http://frontend;
}
location /socket.io {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /api {
proxy_pass http://backend;
}
location /_next/webpack-hmr {
proxy_pass http://frontend/_next/webpack-hmr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /sockjs-node {
proxy_pass http://frontend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
로컬 개발 환경에서 localhost의 SOCKET_URL을 http://localhost:3000 로 잘 사용 했었는데 웹소켓 ssl 통신을 위해서는 wss 프로토콜을 사용 해야한다.
wss://your-domain.com/socket.io 이런식으로 한번 바꿔보자
nestjs webgateway 설정
₩@WebSocketGateway({
transports: ['websocket'],
namespace: 'chats',
cors: {
origin: process.env['ENV_CLIENT_SOCKET_URL'],
credentials: true,
},
})
nextjs socketio 설정
export const useSocket = () => {
const [isConnected, setConnected] = useState<boolean>(false);
const [layer, setLayer] =
useRecoilState<MessageModalAtomType>(messageModalAtom);
const onConnect = () => {
setConnected(true);
};
const onDisConnect = () => {
setConnected(false);
};
useEffect(() => {
const accessToken = getCookie(ACCESS_TOKEN_KEY as string);
socket = io(`${SOCKET_URL}/chats`, {
transports: ['websocket'],
secure: process.env.NODE_ENV === 'production' ? true : false,
withCredentials: true,
auth: {
authorization: accessToken,
},
});
socket.on('connect', onConnect);
socket.on('disconnect', onDisConnect);
return () => {
socket.off('connect', onConnect);
socket.off('disconnect', onDisConnect);
};
}, [isConnected, setLayer]);
return {
socket,
isConnected,
};
};
SOCKET_URL을 http://localhost:3000로 잘 사용 했었는데 wss://your-domain.com/socket.io 이런식으로 바꿨었다.
성공 해결 했다.
해결 하는 실마리는 클라이언트에서 요청하는 SOCKET_URL을 wss:도메인으로 하고 백엔드에서 cors origin을 https://도메인으로 하면 된다.
추가로 nextjs에서 production 환경에서 sharp 를 추가 해주어야 되나보다.
Error: 'sharp' is required to be installed in standalone mode for the image optimization to function correctly. Read more at: https://nextjs.org/docs/messages/sharp-missing-in-production
npm i sharp
728x90