[javascript] Socket.io의 인증 방법은 무엇이 있나요?
- 세션 기반 인증(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'); });
- 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) => { // 클라이언트 인증 성공 시 처리 });
- 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 { // 인증되지 않은 사용자 처리 } });
이 외에도 기타 인증 방법을 사용할 수 있습니다. 선택한 인증 방법은 프로젝트의 요구사항과 보안 수준에 따라 결정하면 됩니다.
참고 자료: