Socket.io-client: ์ž˜๋ชป๋œ ํ•ธ๋“œ์…ฐ์ดํฌ ๋ฐฉ๋ฒ•(์ถ”๊ฐ€ ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ!)

์— ๋งŒ๋“  2017๋…„ 06์›” 23์ผ  ยท  13์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: socketio/socket.io-client

์›ํ•˜๋Š” ์ž‘์—…:

  • [x] ๋ฒ„๊ทธ ๋ณด๊ณ 
  • [ ] ๊ธฐ๋Šฅ ์š”์ฒญ

ํ˜„์žฌ ํ–‰๋™

๋‚ด ์„œ๋ฒ„์— ์ถ”๊ฐ€ ํ—ค๋”๋ฅผ ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•  ๋•Œ {"code":2,"message":"Bad handshake method"} ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ 400์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž˜ ์ž‘๋™ํ•จ).

์žฌํ˜„ ๋‹จ๊ณ„(ํ˜„์žฌ ๋™์ž‘์ด ๋ฒ„๊ทธ์ธ ๊ฒฝ์šฐ)

๋‹ค์Œ ๊ตฌ์„ฑ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  const options = {
    transportOptions: {
      polling: {
        extraHeaders: {
          Authorization: "Bearer test"
        }
      }
    }
  };

๋‚˜๋Š” ๋˜ํ•œ ์ด ์ถ”๊ฐ€ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ OPTIONS ์š”์ฒญ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค(์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ๋•Œ GET ๋Œ€์‹ )

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™

ํ•ธ๋“œ์…ฐ์ดํฌ๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๋Š” ์ถ”๊ฐ€ ํ—ค๋”๊ฐ€ ์žˆ๋Š” get GET ์š”์ฒญ(์ฟ ํ‚ค ์œ ์ง€).

์„ค์ •

  • ์šด์˜ ์ฒด์ œ: ๋งฅ
  • ๋ธŒ๋ผ์šฐ์ €: ํฌ๋กฌ 58
  • socket.io ๋ฒ„์ „: 2.0.3

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•! ์„œ๋ฒ„ ์ธก์—์„œ ์ ์ ˆํ•œ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(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์— ์˜ˆ์ œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  13 ๋Œ“๊ธ€

๊ฐ™์€ ๋ฌธ์ œ, ์—ฌ๊ธฐ .. โ€‹โ€‹๋ธŒ๋ผ์šฐ์ €๋Š” ์•„๋‹ˆ์ง€๋งŒ nodejs ๋ฒ„์ „์˜ socket.io-client์™€ ์™„์ „ํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • ์šด์˜ ์ฒด์ œ: ์Šน๋ฆฌ
  • ๋ธŒ๋ผ์šฐ์ €: ํฌ๋กฌ 59
  • socket.io ๋ฒ„์ „: 2.0.3

์•ˆ๋…•! ์„œ๋ฒ„ ์ธก์—์„œ ์ ์ ˆํ•œ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(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 ์ถœ์ฒ˜์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•, ๋‹ค์Œ ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. '์ ‘๊ทผ-์ œ์–ด-ํ—ˆ์šฉ-์›์ ': ' http://localhost :3001, http://localhost :3002'
  2. '์ ‘๊ทผ-์ œ์–ด-ํ—ˆ์šฉ-์›์ ': [' http://localhost :3001, http://localhost :3002']
  3. '์ ‘๊ทผ-์ œ์–ด-ํ—ˆ์šฉ-์›์ ': ' http://localhost :3001 http://localhost :3002'

@DaVincii ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ํ—ค๋” ์ถœ์ฒ˜๋ฅผ ์ฝ๊ณ  ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

stackoveflow์—์„œ ์ด๊ฒƒ ๊ณผ ์ด๊ฒƒ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@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๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ณ ์น ๊นŒ?
image

์ด๊ฒƒ์€ ์ตœ์‹  socket.io์—์„œ ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Typescript๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ณ ์น ๊นŒ?

@supertiger1234 handlePreflightRequest ์—๋Š” ์ตœ์‹  ๋ฒ„์ „์—์„œ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Screenshot 2020-07-20 at 20 16 00

๋”ฐ๋ผ์„œ ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

...
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 ์˜ ์ด์ „ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ์ž˜๋ชป ๊ตฌ์„ฑ๋œ ์บ์‹œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ž˜์˜ ๋…์ž๋Š” ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰