Socket.io: CORS

์— ๋งŒ๋“  2017๋…„ 02์›” 03์ผ  ยท  11์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: socketio/socket.io

ํ—ค์ด,

์‘๋‹ต ํ—ค๋” Access-Control-Allow-Origin ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•
{'origins' : 'asfdasd.com'} ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

POST /socket.io/?EIO=3&transport=polling&t=1481690658797-5&sid=Dp18NNt_bWPkB4rGAAAP HTTP/1.1
์ถœ์ฒ˜: https://evilhost.net

HTTP/1.1 400 ์ž˜๋ชป๋œ ์š”์ฒญ
์ฝ˜ํ…์ธ  ์œ ํ˜•: application/json
์•ก์„ธ์Šค ์ œ์–ด ํ—ˆ์šฉ ์ž๊ฒฉ ์ฆ๋ช…: true
์•ก์„ธ์Šค ์ œ์–ด ํ—ˆ์šฉ ์ถœ์ฒ˜: https://evilhost.net
๋‚ ์งœ: 2017๋…„ 2์›” 3์ผ ๊ธˆ์š”์ผ 12:27:42 GMT
์—ฐ๊ฒฐ: ์—ฐ๊ฒฐ ์œ ์ง€
์ „์†ก ์ธ์ฝ”๋”ฉ: ์ฒญํฌ

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

@theEpisode ๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ค๋ž˜๋œ ์Šค๋ ˆ๋“œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ทธ ๋งˆ์ง€๋ง‰ ๋งํฌ๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด app.listen(...) ์žˆ์ง€๋งŒ socket.io ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ index.js http.listen(...) ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‹ค์Œ์„ ๋“ฃ์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. app ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ด CORS ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ž‘์€ ์ผ!

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

๊ฐ™์€ ์˜ค๋ฅ˜

@Kenzku @thEpisode ์–ด๋–ค ๋ฒ„์ „์˜ socket.io๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

2.x ์—์„œ ์ˆ˜์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(https://github.com/socketio/engine.io/pull/452 ํฌํ•จ).

์•ˆ๋…•ํ•˜์„ธ์š” @darrachequesne ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” Crawler Site(https://www.crawlersite.com)์˜ ์ž‘์„ฑ์ž์ด๋ฉฐ Socket.io๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๊ณ  ๋ชจ๋“  ์ธํ”„๋ผ๋Š” Microsoft Azure์— ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ๋ฐ ์ฒซ ๋ฒˆ์งธ ๋ฒ ํƒ€ ํ…Œ์Šคํ„ฐ๋Š” Azure๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์šฐ๋ฆฌ๋Š” ๋ฌธ์ œ๋Š” ์—†์ง€๋งŒ ์ƒˆ๋กœ์šด ๋ฒ ํƒ€ ํ…Œ์Šคํ„ฐ๋Š” ๋‹ค๋ฅธ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฒ„๊ทธ๋ฅผ๋ณด๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” CORS์ž…๋‹ˆ๋‹ค. Google์—์„œ ๋ชจ๋“  ์งˆ๋ฌธ์„ ์ฝ์Šต๋‹ˆ๋‹ค!! ๊ฒ€์ƒ‰ ์†”๋ฃจ์…˜์—์„œ Socket.io๊ฐ€ 2.0(์„œ๋ฒ„์—์„œ ์ •ํ™•ํžˆ 2.0.1)์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Œ์„ โ€‹โ€‹ํ™•์ธํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์ง€์†๋˜๋ฉฐ CORS ๋ฌธ์ œ๋„ ๋ณด๊ณ ํ•œ Express๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Google์˜ ๋ชจ๋“  ์†”๋ฃจ์…˜์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋‹นํ™ฉ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. GitHub ๋ฌธ์ œ ๋˜๋Š” StackOverflow์— ์ด๊ฒƒ์„ ๊ฒŒ์‹œํ•˜์ง€ ์•Š์€ ์ ์— ๋Œ€ํ•ด ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธํ•  ์ผ๋ถ€ URL:

๋ฐฑ ์—”๋“œ URI: http://crawlerbackend.azurewebsites.net
Express CORS ํ…Œ์ŠคํŠธ: https://testcors.000webhostapp.com (์ด ํ˜ธ์ŠคํŒ…์€ ํ…Œ์Šคํ„ฐ๊ฐ€ ์‚ฌ์šฉํ•จ)
Socket.io CORS ํ…Œ์ŠคํŠธ: https://testcrawlersite.000webhostapp.com (์ฝ˜์†” ์ฐธ์กฐ)
ํ…Œ์ŠคํŠธํ•  ๊ธฐ๋ณธ ์‚ฌ์ดํŠธ: http://crawler-test.azurewebsites.net (์ƒˆ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ์†์ƒ๋จ)
Socket.io ํŒŒ์ผ: http://crawlerbackend.azurewebsites.net/socket.io.js

app.js์˜ ์ผ๋ถ€:
`
var ๊ฒฝ๋กœ = ์š”๊ตฌ('๊ฒฝ๋กœ');
var bodyParser = require('๋ณธ์ฒด ํŒŒ์„œ');
var cors = require('cors');
var ํ‘œํ˜„ = ์š”๊ตฌ('ํ‘œํ˜„');
var ์•ฑ = ์ต์Šคํ”„๋ ˆ์Šค();

// use body parser so we can get info from POST and/or URL parameters
app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies
app.use(bodyParser.json()); // support json encoded bodies
app.use(cors({ origin: '*' }));
// Settings for CORS
app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.header('Access-Control-Allow-Origin', '*');

    // Request methods you wish to allow
    res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

    // Request headers you wish to allow
    res.header('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', false);

    // Pass to next layer of middleware
    next();
});

var server = app.listen(cross.NormalizePort(process.env.PORT || 3500));
var io = require('socket.io').listen(server, {
    log: false,
    agent: false,
    origins: '*:*',
    transports: ['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling', 'polling']
});

`

๋ฌธ์ œ ํ•ด๊ฒฐ!! @Kenzku๋Š” ์ด ๋ฌธ์„œ๋ฅผ ๊ฒ€ํ† ํ•˜์‹ญ์‹œ์˜ค: https://github.com/socketio/socket.io/blob/master/docs/API.md#serveroriginsvalue ๋ฐ ์ฝ”๋“œ: https://github.com/socketio/socket.io /blob/master/lib/index.js#L67 ๋ฐ Express๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค(์ด ์˜ˆ์ œ๋Š” ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค): https://github.com/socketio/socket.io#in -conjunction-with-express

์—„์ฒญ๋‚œ! ์ด์ œ ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@theEpisode ๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ค๋ž˜๋œ ์Šค๋ ˆ๋“œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ทธ ๋งˆ์ง€๋ง‰ ๋งํฌ๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด app.listen(...) ์žˆ์ง€๋งŒ socket.io ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ index.js http.listen(...) ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‹ค์Œ์„ ๋“ฃ์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. app ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ด CORS ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ž‘์€ ์ผ!

@frewinchristopher ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ์—์„œ๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์›๊ฒฉ์—์„œ๋Š” ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(์ด์œ : CORS ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค). ๋‚ด๊ฐ€ ์–ด๋”” ์ž˜๋ชปํ–ˆ์–ด..?

@gowthamyaal ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ฑฑ์ •ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ AWS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํƒ„๋ ฅ์  IP ๋ฐ ๋กœ์ปฌ IP์™€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์—ฌ CORS ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์†Œ์ผ“ ์ˆ˜์‹  IP๋ฅผ 0.0.0.0์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์›๊ฒฉ์—์„œ ๊ฒฝ์Ÿ ์กฐ๊ฑด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜์—ฌ webpack-dev-config๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. io connect๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋™์ผํ•œ ํŒŒ์ผ์—์„œ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์ •์˜๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์›นํŒฉ ๊ฐœ๋ฐœ ๊ตฌ์„ฑ

ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“ ์ฝ”๋“œ
;)

์ฃผ์„์ด ๋‹ฌ๋ฆฐ ์ค„์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ... ๋ˆ„๊ตฌ๋“ ์ง€ ์ด๊ฒƒ์œผ๋กœ ๋‚˜๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ... ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‚ด๊ฐ€ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์†”๋ฃจ์…˜์„ ๋”ฐ๋ž์ง€๋งŒ ์•„์ง ์ž‘๋™ํ•˜๋Š” ์‘๋‹ต์„ ๋ณด๋‚ด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ด ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‚˜๋Š” ๋งค์šฐ ๊ฐ์‚ฌ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

`const express = require('express')
const http = ์š”๊ตฌ('http')
const socketIO = ์š”๊ตฌ('socket.io')
const cors = ์š”๊ตฌ('cors')

// ํ˜ธ์ŠคํŠธ ํฌํŠธ
์ƒ์ˆ˜ ํฌํŠธ = 3001

const ์•ฑ = ์ต์Šคํ”„๋ ˆ์Šค()
app.use(cors())
// ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค
const ์„œ๋ฒ„ = http.createServer(์•ฑ)
// ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์ผ“ ์ƒ์„ฑ
const io = socketIO(์„œ๋ฒ„)

io.origins("http://localhost:3000")

io.on('์—ฐ๊ฒฐ', ์†Œ์ผ“ => {
console.log("์‚ฌ์šฉ์ž ์—ฐ๊ฒฐ")

socket.on('disconnect', () => {
    console.log("User Disconnected")
})

socket.on('send message', (message) => {
    io.sockets.emit('send message', message)
})

})

server.listen(ํฌํŠธ, () => console.log( Listening on port ${port} ))`

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