[javascript] Socket.io의 인증 방법은 무엇이 있나요?
  1. 세션 기반 인증(Session-based authentication)
    • Express.js와 함께 사용할 수 있는 세션 기반의 인증 방식입니다. 사용자가 로그인할 때 세션을 생성하고, 서버는 클라이언트에게 세션 ID를 할당합니다. 이 세션 ID를 사용하여 소켓 연결 시 인증을 수행할 수 있습니다.
    const session = require('express-session');
    const sharedsession = require('express-socket.io-session');
    const app = require('express')();
    const http = require('http').Server(app);
    const io = require('socket.io')(http);
    
    const sessionMiddleware = session({
      secret: 'your-secret-key',
      resave: true,
      saveUninitialized: true
    });
    
    app.use(sessionMiddleware);
    io.use(sharedsession(sessionMiddleware));
    
    io.on('connection', (socket) => {
      if(socket.handshake.session.loggedIn) {
        // 인증된 사용자 처리
      } else {
        // 인증되지 않은 사용자 처리
      }
    });
    
    http.listen(3000, () => {
        console.log('Server listening on port 3000');
    });
    
  2. JWT 인증(JSON Web Token authentication)
    • 클라이언트에서 로그인 시 서버는 JWT를 발급하여 클라이언트에게 전달합니다. 클라이언트는 이 JWT를 소켓 연결 시 헤더에 포함시켜 서버에 인증을 요청합니다.
    const jwt = require('jsonwebtoken');
    const io = require('socket.io')(http);
    
    io.use((socket, next) => {
      if(socket.handshake.auth && socket.handshake.auth.token) {
        jwt.verify(socket.handshake.auth.token, 'your-secret-key', (err, decoded) => {
          if(err) return next(new Error('Authentication error'));
          socket.decoded = decoded;
          next();
        });
      } else {
        next(new Error('Authentication error'));
      }
    });
    
    io.on('connection', (socket) => {
      // 클라이언트 인증 성공 시 처리
    });
    
  3. Passport.js를 사용한 인증
    • Passport.js는 Node.js용 인증 미들웨어로, 다양한 인증 방식을 지원합니다. 이를 사용하여 Socket.io에 인증을 추가할 수 있습니다.
    const passportSocketIo = require('passport.socketio');
    const passport = require('passport');
    
    const sessionMiddleware = session({
      secret: 'your-secret-key',
      resave: true,
      saveUninitialized: true
    });
    
    app.use(sessionMiddleware);
    app.use(passport.initialize());
    app.use(passport.session());
    
    io.use(passportSocketIo.authorize({
      cookieParser: cookieParser,
      secret: 'your-secret-key',
      store: sessionStore
    }));
    
    io.on('connection', (socket) => {
      if(socket.request.user.logged_in) {
        // 인증된 사용자 처리
      } else {
        // 인증되지 않은 사용자 처리
      }
    });
    

이 외에도 기타 인증 방법을 사용할 수 있습니다. 선택한 인증 방법은 프로젝트의 요구사항과 보안 수준에 따라 결정하면 됩니다.

참고 자료: