๋๋ socket.io(์ ํํ๊ฒ๋ engine.io)๊ฐ ํธ์ถ๋ URL์ 'io'๋ผ๋ ๋น๋ณด์ ์ธ์ ์ฟ ํค๋ฅผ ์ค์ ํ๊ณ ์๋ค๋ ๊ฒ์ ์์์ฐจ๋ ธ์ต๋๋ค. ์ด ์ฟ ํค์ ์ญํ ์ ๋ฌด์์ด๋ฉฐ ํ์ํ ๊ฒฝ์ฐ ๋ณด์์ ์ ์งํ ์ ์์ต๋๊น? socket.io๊ฐ ์คํ๋๋ ๋ชจ๋ ์์น์ ๋ํด https://๋ฅผ ๊ฐ์ ์คํํ๊ณ ์ด ์ฟ ํค๋ฅผ ๋ณด์์ผ๋ก ์ฝ๊ฒ ์ค์ ํ ์ ์์ง๋ง ์์น๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
์๋ฌด ์ฉ๋๋ก ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์๋ฒ ์ต์
์์ cookie: false
๋ฅผ ์ค์ ํ์ฌ ๋นํ์ฑํํ ์ ์์ต๋๋ค.
์ต๊ณ ์ ๋ต๋ณ - ๊ฐ์ฌํฉ๋๋ค!
ํด๊ฒฐ๋ ๋๋ก ์ข ๋ฃ - ๊ฐ์ฌํฉ๋๋ค
@Nibbler999 ์ด ์ต์ ์ ์ด๋์ ์์ต๋๊น? ์ด ์ค์ ์ ์ ํํ ์ด๋์ ๋๋์?
@wisniewski94 ์ต์ ์ ์ฌ๊ธฐ์ ๋ฌธ์ํ๋์ด ์์ต๋๋ค: https://github.com/socketio/engine.io#methods -1
var io = require('socket.io')();
io.on('connection', function(client){});
io.listen(3000, {
cookie: false
});
@darrachequesne ์ ๋ง ๊ฐ์ฌํฉ๋๋ค! ๋น์ ์ ๋์์ด ์์๋ค๋ฉด ๊ทธ๊ฒ๋ค์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ๋์๊ฒ ์ฌ์ ํ ๋ถ๋ถ๋ช ํ์ ๊ฒ์ ๋๋ค. README.md์ ์์ ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ ๋์ ์๋ฏธ์์ ํด๋น ์ฟ ํค๋ ์ด๋์๋ ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ ์ ๊ฑฐ๋ ์ ์์ต๋๋ค.
์๋ ํ์ธ์ @darrachequesne ,
์ฌ๊ธฐ ๋ด ํ์ฌ ์ฝ๋๊ฐ ์์ต๋๋ค.
var server = http.createServer(app);
var socket = require('socket.io');
var io = socket().listen(server,
{
cookie: false
});
๊ทธ๋ฌ๋ ์๋ฒ๋ ์ฌ์ ํ io
์ฟ ํค๋ฅผ ๋ณด๋
๋๋ค.
io์ ์ต์คํ๋ ์ค ์๋ฒ ์ฐ๋์ ์ฟ ํค ๋ฌธ์ ๋ ์๋์?
๊ฐ์ฌ ํด์.
ํ ๊ฐ์ง ๋, ์น ์์ผ ์์ฒญ( 101 Switching Protocols
์๋ต)์ ๋ํด Access-Control-Allow-Origin
ํค๋๋ฅผ ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ด๊ธฐํ ๋จ๊ณ์์ io.origins(config.origin)
๋ฅผ ์ค์ ํ์ง๋ง XHR ์์ฒญ์๋ง ์ ์ฉ๋ฉ๋๋ค.
๋ฐฐ๊ฒฝ์ Origin ํค๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ํ์ง ์์ ๊ฒ์ด ์ทจ์ฝํ ์์ฒญ์ด๋ผ๋ ์์ฒญ์ด ์๋ ๊ฒฝ์ฐ์ธ๋ฐ, ๋ง๋์?
@tienlx93 ์ฌํํ ์ ์์ต๋๋ค: https://github.com/darrachequesne/socket.io-fiddle/tree/issues-2276
๋ฐฐ๊ฒฝ์ Origin ํค๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ํ์ง ์์ ๊ฒ์ด ์ทจ์ฝํ ์์ฒญ์ด๋ผ๋ ์์ฒญ์ด ์๋ ๊ฒฝ์ฐ์ธ๋ฐ, ๋ง๋์?
Access-Control-Allow-Origin
ํค๋๋ ๋๋ฉ์ธ ๊ฐ ์์ฒญ( MDN )์๋ง ์ ์ฉ๋ฉ๋๋ค. io.origins()
ํ์ฉ๋ ์ถ์ฒ๋ฅผ ์ค์ ํ๋ค๋ฉด ๊ด์ฐฎ์ ๊ฒ์
๋๋ค.
์ ๋ณด์ ๋ํด์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ฐธ๊ณ ๋ก express๋ฅผ ์๋ฒ๋ก ์ฌ์ฉํ ๋ ์ด ์ฟ ํค๋ฅผ false๋ก ์ค์ ํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
var server = require('http').createServer(express());
var io = require('socket.io')(server, { path:"/some/path", cookie: false });
@darrachequesne socket.io-2.0์์ ์ด ์ฟ ํค๋ฅผ ์์ ํ๊ฒ ์ค์ ํ๊ณ ์ฟผ๋ฆฌ ๋ฌธ์์ด์์ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
@darrachequesne socket.io-2.0์์ ์ด ์ฟ ํค๋ฅผ ์์ ํ๊ฒ ์ค์ ํ๊ณ ์ฟผ๋ฆฌ ๋ฌธ์์ด์์ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
socket.io^2.0์์ ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๊ฒ์ํ ์ ์์ต๋๊น?
์ต๊ทผ์ ์ด ์ฟ ํค์ ๊ด๋ จํ์ฌ Chrome ์ฝ์์์ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
(URL)์ ๊ต์ฐจ ์ฌ์ดํธ ๋ฆฌ์์ค์ ์ฐ๊ฒฐ๋ ์ฟ ํค๊ฐ SameSite
์์ฑ ์์ด ์ค์ ๋์์ต๋๋ค. Chrome์ ํฅํ ๋ฆด๋ฆฌ์ค๋ SameSite=None
๋ฐ Secure
๋ก ์ค์ ๋ ๊ฒฝ์ฐ ๊ต์ฐจ ์ฌ์ดํธ ์์ฒญ์ด ์๋ ์ฟ ํค๋ง ์ ๊ณตํฉ๋๋ค.
๊ฒ์ํ์ฌ ์ฌ๊ธฐ๊น์ง ์ค๋ ์ฌ๋์๊ฒ ๋์์ด ๋๋ค๋ฉด ์์ ๊ฐ์ด cookie: false
์ต์
์ ์ค์ ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ์ด์ ๊ฒฝ๊ณ ๊ฐ ํ์๋์ง ์์ผ๋ฉฐ ์ฟ ํค๋ฅผ ์ค์ ํ์ง ์์๋ ์ฑ์ด ์ ๋๋ก ์๋ํฉ๋๋ค.
์ต๊ทผ์ ์ด ์ฟ ํค์ ๊ด๋ จํ์ฌ Chrome ์ฝ์์์ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
(URL)์ ๊ต์ฐจ ์ฌ์ดํธ ๋ฆฌ์์ค์ ์ฐ๊ฒฐ๋ ์ฟ ํค๊ฐSameSite
์์ฑ ์์ด ์ค์ ๋์์ต๋๋ค. Chrome์ ํฅํ ๋ฆด๋ฆฌ์ค๋SameSite=None
๋ฐSecure
๋ก ์ค์ ๋ ๊ฒฝ์ฐ ๊ต์ฐจ ์ฌ์ดํธ ์์ฒญ์ด ์๋ ์ฟ ํค๋ง ์ ๊ณตํฉ๋๋ค.๊ฒ์ํ์ฌ ์ฌ๊ธฐ๊น์ง ์ค๋ ์ฌ๋์๊ฒ ๋์์ด ๋๋ค๋ฉด ์์ ๊ฐ์ด
cookie: false
์ต์ ์ ์ค์ ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ์ด์ ๊ฒฝ๊ณ ๊ฐ ํ์๋์ง ์์ผ๋ฉฐ ์ฟ ํค๋ฅผ ์ค์ ํ์ง ์์๋ ์ฑ์ด ์ ๋๋ก ์๋ํฉ๋๋ค.
๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํ์ง ์์ต๋๋ค.
๋ด ์ฝ๋:
http.listen(port, {cookie: false}, function(){
console.log('listening on *:' + port);
});
๋ญ๊ฐ ์๋ชป ๋์ ๋?
@GuilhermeCouto , http.listen์ด ์๋ _socket_์ ์ด๊ธฐํํ ๋ {cookie: false}
์ต์
์ ์ค์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ฅผ ์ํด ์ผํ ์์ ์ ๊ณต๋ ์๋ฃจ์
์ express๋ฅผ ์ฌ์ฉํ๋ ์๋ฃจ์
์
๋๋ค.
var server = require('http').createServer(express());
var io = require('socket.io')(server, { path:"/some/path", cookie: false });
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค
@GuilhermeCouto , http.listen์ด ์๋ _socket_์ ์ด๊ธฐํํ ๋
{cookie: false}
์ต์ ์ ์ค์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ฅผ ์ํด ์ผํ ์์ ์ ๊ณต๋ ์๋ฃจ์ ์ express๋ฅผ ์ฌ์ฉํ๋ ์๋ฃจ์ ์ ๋๋ค.var server = require('http').createServer(express()); var io = require('socket.io')(server, { path:"/some/path", cookie: false });
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค
Doug๋ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค.
์ง๋ฌธ ํ๋๋ง ๋ ํ์๊ฒ ์ต๋๊น?
๊ฒฝ๋ก์ ๋ฌด์์ ์
๋ ฅํฉ๋๊น?
๋ด ์์คํ
์ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค. ๋ค๋ฅธ PC๊ฐ ๋ก์ปฌ ์๋ฒ์ ์ฐ๊ฒฐํ๋ ๋ก์ปฌ ๋คํธ์ํฌ๊ฐ ์์ต๋๋ค.
๋ด๋ถ IP๋ ๊ณ ๊ฐ๋ง๋ค ๋ค๋ฆ
๋๋ค.
๋ด ์ฝ๋:
var app = require("express")();
var http = require("http").Server(app);
var io = require("socket.io")(http);
var port = process.env.PORT || 3000;
// maps socket.id to user"s nickname
var nicknames = {};
// list of socket ids
var clients = [];
var namesUsed = [];
app.get("/", function(req, res){
res.sendFile(__dirname + "/index.html");
});
io.on("connection", function(socket){
handleNewUser(socket);
handleTV(socket);
//showActiveUsers(socket);
handleClientDisconnections(socket);
handleMessageBroadcasting(socket);
handlePrivateMessaging(socket);
});
http.listen(port, function(){
console.log("listening on *:" + port);
});
function handleTV(socket) {
socket.on("flugo message", function(msg){
console.log("flugo message");
io.emit("flugo message", msg);
});
}
function handleNewUser(socket){
socket.on("user join", function(atendente) {
console.log("user join");
if (atendente) {
var ind = namesUsed.indexOf(atendente.nome);
if (ind !== -1) {
//ja tem alguem com esse nome, pode ser a mesma conexao da mesma pessoa
clients[ind] = socket;
nicknames[socket.id] = atendente;
}else
{
ind = namesUsed.push(atendente.nome) - 1;
clients[ind] = socket;
nicknames[socket.id] = atendente;
}
//io.sockets.emit("new user", {id: ind, from: from});
showActiveUsers(socket);
}
});
}
function handleMessageBroadcasting(socket){
socket.on("message", function(msg,callback){
console.log("message");
if(nicknames[socket.id])
{
var from = nicknames[socket.id].nome;
var user_id = nicknames[socket.id].id;
var now = new Date();
io.sockets.emit("message", {id: user_id, from: from, date: now.getTime(), msg: msg});
callback("message");
}
});
}
function handlePrivateMessaging(socket){
socket.on("private message", function(data, callback){
console.log("private message");
if(nicknames[socket.id])
{
var from = nicknames[socket.id].nome;
var user_id = nicknames[socket.id].id;
var ind = namesUsed.indexOf(data.userToPM);
if (ind !== -1) {
var now = new Date();
clients[ind].emit("private message", {id: user_id, from: from, date: now.getTime(), msg: data.msg}, function(data2, callback2){
callback("private message");
});
}
}
});
}
function handleClientDisconnections(socket){
socket.on("disconnect", function(){
console.log("disconnect");
if(nicknames[socket.id])
{
var ind = namesUsed.indexOf(nicknames[socket.id].nome);
var at = nicknames[socket.id];
delete namesUsed[ind];
delete clients[ind];
delete nicknames[socket.id];
io.sockets.emit("user disconnect", at);
}
});
}
function showActiveUsers(socket){
var activeNames = [];
var usersInRoom = io.sockets.sockets;
console.log("names");
//if(usersInRoom!===undefined){
for (var index in usersInRoom){
var userSocketId = usersInRoom[index].id;
if (nicknames[userSocketId]){
var name = nicknames[userSocketId].nome;
activeNames.push({id: namesUsed.indexOf(name), from: name});
}
}
io.sockets.emit("names", activeNames);
// }
}
๊ทธ ์ค ๋ํซ์ ์์ Ikende์ ๋ต๋ณ์์ ๊ฐ์ ธ์จ ๊ฒ์ด๋ฏ๋ก path
์ต์
์ด ๋ฌด์์ ๋งํ๋์ง ์์ ํ ํ์คํ์ง ์์ง๋ง ์ง์ ํ ํ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋์์ด ๋๋ค๋ฉด ์ฌ๊ธฐ ๋ด ์ฝ๋์ ๊ด๋ จ ์ค๋ํซ์ด ์์ต๋๋ค(์ ๋ typescript๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค).
import * as express from 'express';
import { createServer, Server } from 'http';
import * as socketIo from 'socket.io';
this.app = express();
this.server = createServer(this.app);
this.io = socketIo(this.server, { cookie: false });
this.server.listen(this.port, () => {
this.log('Running server on port ' + this.port);
});
this.io.on('connect', (socket: SocketIO.Socket) => { bunch of code here }
, { ์ฟ ํค: ๊ฑฐ์ง }
์๋ํ์ง ์์์ต๋๋ค. =/
์ด๋ค ๋ฒ์ ์ socket.io๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
2.2.0. ๋ด ๊ธฐ์ต์ด ํ๋ฆฟํ์ง๋ง ์์ ์ฌํญ์ ํ์ธํ๋ ค๋ฉด Chrome์ ์ข ๋ฃํ๊ณ ์ ์ธ์คํด์ค๋ฅผ ์์ํ๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ํ์ด์ง์ Chrome ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ํตํด ์ฟ ํค๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํธ์ง : ์๋ง๋ ์๋ฒ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๊ณ ๋ค์ ์์ํด์ผํ์ ๊ฒ์ ๋๋ค.
์ฌ์ฉํ์ง ์๋๋ฐ๋ ์กด์ฌํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
io.attach
๋ฐฉ๋ฒ์ผ๋ก http ๋ฐ https ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์๋ํ์ต๋๋ค.
io.attach(httpServer, {cookie: false});
io.attach(httpsServer, {cookie: false});
์ฌ๊ธฐ์์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋งํ๋ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก ์ด ์ฟ ํค๋ ์ฌ๊ธฐ Haproxy ์ต์ ์์ ์ค๋ช ๋ ๊ฒ์ฒ๋ผ socket.io ์๋ฒ์ ์ฌ๋ฌ ๋์ ์ธ์คํด์ค๊ฐ ์๋ ์์คํ ์์ ๊ณ ์ ์ฑ์ ์ ๊ณตํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. https://socket.io/docs/using- ๋ค์ค ๋ ธ๋.
๊ทธ๋ฌ๋ ์ฟ ํค์ sameSite๋ฅผ ์ค์ ํ๋ ์ต์ ์ด ์์ผ๋ฏ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ต๊ทผ์ ์ด ์ฟ ํค์ ๊ด๋ จํ์ฌ Chrome ์ฝ์์์ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
(URL)์ ๊ต์ฐจ ์ฌ์ดํธ ๋ฆฌ์์ค์ ์ฐ๊ฒฐ๋ ์ฟ ํค๊ฐ
SameSite
์์ฑ ์์ด ์ค์ ๋์์ต๋๋ค. Chrome์ ํฅํ ๋ฆด๋ฆฌ์ค๋SameSite=None
๋ฐSecure
๋ก ์ค์ ๋ ๊ฒฝ์ฐ ๊ต์ฐจ ์ฌ์ดํธ ์์ฒญ์ด ์๋ ์ฟ ํค๋ง ์ ๊ณตํฉ๋๋ค.๊ฒ์ํ์ฌ ์ฌ๊ธฐ๊น์ง ์ค๋ ์ฌ๋์๊ฒ ๋์์ด ๋๋ค๋ฉด ์์ ๊ฐ์ด
cookie: false
์ต์ ์ ์ค์ ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ์ด์ ๊ฒฝ๊ณ ๊ฐ ํ์๋์ง ์์ผ๋ฉฐ ์ฟ ํค๋ฅผ ์ค์ ํ์ง ์์๋ ์ฑ์ด ์ ๋๋ก ์๋ํฉ๋๋ค.