๋ด ์๋ฒ์ ์ถ๊ฐ ํค๋๋ฅผ ์ฐ๊ฒฐํ๋ ค๊ณ ํ ๋ {"code":2,"message":"Bad handshake method"}
๋ฉ์์ง์ ํจ๊ป 400์ด ํ์๋ฉ๋๋ค(์ถ๊ฐํ๋ ค๊ณ ํ์ง ์์ผ๋ฉด ์ ์๋ํจ).
๋ค์ ๊ตฌ์ฑ์ผ๋ก ์๋ฒ๋ฅผ ์ฐ๊ฒฐํ๋ ค๊ณ ํฉ๋๋ค.
const options = {
transportOptions: {
polling: {
extraHeaders: {
Authorization: "Bearer test"
}
}
}
};
๋๋ ๋ํ ์ด ์ถ๊ฐ ํค๋๋ฅผ ์ถ๊ฐํ ๋ OPTIONS ์์ฒญ์ด ๋ง๋ค์ด์ง๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค(์ถ๊ฐํ์ง ์์ ๋ GET ๋์ )
ํธ๋์ ฐ์ดํฌ๋ฅผ ์ค๋จํ์ง ์๋ ์ถ๊ฐ ํค๋๊ฐ ์๋ get GET ์์ฒญ(์ฟ ํค ์ ์ง).
๊ฐ์ ๋ฌธ์ , ์ฌ๊ธฐ .. โโ๋ธ๋ผ์ฐ์ ๋ ์๋์ง๋ง nodejs ๋ฒ์ ์ socket.io-client์ ์์ ํ ์๋ํฉ๋๋ค.
์๋ ! ์๋ฒ ์ธก์์ ์ ์ ํ ํค๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(CORS ์ํฉ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค).
const io = require('socket.io')(3000, {
handlePreflightRequest: function (req, res) {
var headers = {
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Allow-Origin': 'http://localhost:3001',
'Access-Control-Allow-Credentials': true
};
res.writeHead(200, headers);
res.end();
}
});
https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers์ ์์ ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
@darrachequesne ์ถ์ฒ์ ๋ํด ์ฌ๋ฌ ๋๋ฉ์ธ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ, ๋ค์ ๋ฐฉ๋ฒ์ด ์๋ํ์ง ์์ต๋๋ค.
@DaVincii null๋ก ์ ์๋์์ง๋ง ๋ชจ๋ ๋๋ฉ์ธ์ผ๋ก ํด์ ๋ฉ๋๋ค.
const ํค๋ = {
'Access-Control-Allow-Headers': '์ฝํ
์ธ ์ ํ, ๊ถํ ๋ถ์ฌ',
'์ก์ธ์ค ์ ์ด ํ์ฉ-์๋ณธ': null,
'์ก์ธ์ค ์ ์ด ํ์ฉ ์๊ฒฉ ์ฆ๋ช
': true
};
CORS์ฉ
{
handlePreflightRequest: ํจ์(์์ฒญ, ํด์๋) {
var ํค๋ = {
'Access-Control-Allow-Headers': '์ฝํ
์ธ ์ ํ, ๊ถํ ๋ถ์ฌ',
'์ก์ธ์ค-์ ์ด-ํ์ฉ-์๋ณธ': req.headers.origin,
'์ก์ธ์ค ์ ์ด ํ์ฉ ์๊ฒฉ ์ฆ๋ช
': true
};
res.writeHead(200, ํค๋);
res.end();
}
}
CORS์ฉ
{
handlePreflightRequest: ํจ์(์์ฒญ, ํด์๋) {
var ํค๋ = {
'Access-Control-Allow-Headers': '์ฝํ ์ธ ์ ํ, ๊ถํ ๋ถ์ฌ',
'์ก์ธ์ค-์ ์ด-ํ์ฉ-์๋ณธ': req.headers.origin,
'์ก์ธ์ค ์ ์ด ํ์ฉ ์๊ฒฉ ์ฆ๋ช ': true
};
res.writeHead(200, ํค๋);
res.end();
}
}
'์ก์ธ์ค-์ ์ด-ํ์ฉ-์๋ณธ': req.headers.origin
์ด๊ฒ์ ๋ฐฉ๊ธ ๋ด ํ๋ฃจ๋ฅผ ๊ตฌํ์ต๋๋ค! ๋ด๊ฐ ์ฌ์ฉํ์ ๋:
'์ก์ธ์ค ์ ์ด ํ์ฉ-์๋ณธ': ' ',๊ทธ๊ฒ์ ๋์๊ฒ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ์ค ๊ฒ์
๋๋ค :" ์์ฒญ์ ์๊ฒฉ ์ฆ๋ช
๋ชจ๋๊ฐ 'include'์ธ ๊ฒฝ์ฐ ๊ฐ ์๋์ด์ผ ํฉ๋๋ค . XMLHttpRequest์ ์ํด ์์๋ ์์ฒญ์ ์๊ฒฉ ์ฆ๋ช
๋ชจ๋๋ withCredentials ์์ฑ์ ์ํด ์ ์ด๋ฉ๋๋ค. ."
์ด๊ฒ์ ์ต์ socket.io์์ ๋ ์ด์ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Typescript๋ ๊ทธ๊ฒ์ ์ข์ํ์ง ์์ต๋๋ค. ์ด์จ๋ ๊ณ ์น ๊น?
์ด๊ฒ์ ์ต์ socket.io์์ ๋ ์ด์ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Typescript๋ ๊ทธ๊ฒ์ ์ข์ํ์ง ์์ต๋๋ค. ์ด์จ๋ ๊ณ ์น ๊น?
@supertiger1234 handlePreflightRequest
์๋ ์ต์ ๋ฒ์ ์์ ๋ค๋ฅธ ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค.
๋ฐ๋ผ์ ๊ทํ์ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
...
handlePreflightRequest: function(server, req, res) {
var headers = {
"Access-Control-Allow-Headers": "Content-Type, Authorization",
"Access-Control-Allow-Origin": config.allowedOrigins,
"Access-Control-Allow-Credentials": true,
};
res.writeHead(200, headers);
res.end();
...
@supertiger1234 handlePreflightRequest๋ ์ต์ ๋ฒ์ ์์ ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค
โ ๏ธ ์ง๊ธ npm์์ socket.io๋ฅผ ์ค์นํ๋ฉด ์ด์ ๋ฒ์ ์ ๊ฐ๊ฒ ๋์ง๋ง (@types๋ฅผ ํตํด) ํ์ดํ์ ์ค์นํ๋ฉด ์๋ก์ด ํ์ดํ์ด ์๊น๋๋ค! ์ด๋ ์คํด์ ์์ง๊ฐ ์์ต๋๋ค.
์ต์ ์์ผ io๋ฅผ ์ด๋ป๊ฒ ์ค์นํฉ๋๊น?
ํฅํ ์ฐธ์กฐ: ์ด ๋ฌธ์ ๋ 3.0 ์ด์ ํด๋ผ์ด์ธํธ์ 3.0 ์ดํ ์๋ฒ๋ฅผ ํจ๊ป ์ฌ์ฉํ ๋๋ ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ ํด๋ผ์ด์ธํธ๊ฐ socket.io.js
์ ์ด์ ๋ฒ์ ์ ์ฌ์ฉํ๋๋ก ํ๋ ์๋ชป ๊ตฌ์ฑ๋ ์บ์๋ก ์ธํด ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฏธ๋์ ๋ ์๋ ๋ค์์ ์ฐธ์กฐํ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ! ์๋ฒ ์ธก์์ ์ ์ ํ ํค๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(CORS ์ํฉ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค).
https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers์ ์์ ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.