•
상기 호스팅을 읽고 작성한 내 의견이다.
•
사랑하는 우리 진호!! 짱짱짱!
•
자 그럼 시작하자
NestJS와 Socket.IO를 활용한 사용자 인증 구현 요약
1. 개요
•
WebSocket: 양방향 통신을 제공하며 실시간 데이터 전송에 적합.
•
Socket.IO: WebSocket을 편리하게 사용할 수 있는 프레임워크로, 다양한 브라우저 지원 및 폴백 메커니즘 제공.
•
NestJS: Express와 Fastify의 래퍼로, DI(Dependency Injection)와 같은 기능을 통해 구조적이고 확장 가능한 서버 개발을 지원.
2. 주요 내용
1.
Echo 기능 구현:
•
기본 WebSocket Gateway 설정 및 메시지 반송(echo) 구현.
•
클라이언트와 서버 간 통신 테스트를 통해 기본 설정 확인.
2.
Lifecycle Hooks:
•
OnGatewayInit: Gateway 초기화 이벤트 처리.
•
OnGatewayConnection: 클라이언트가 연결될 때 실행.
•
OnGatewayDisconnect: 클라이언트가 연결을 끊을 때 실행.
3.
인증 구현 방법:
•
Guard: 이벤트 발생 시마다 인증을 처리. 하지만 소켓 연결 자체를 인증하지 못하는 한계 존재.
•
handleConnection: 소켓 연결 후 인증을 처리. 그러나 연결 후 인증으로 인해 인증되지 않은 상태에서 일시적으로 연결 가능.
•
Middleware: 소켓 연결 이전에 인증을 수행. 인증 실패 시 연결 자체를 차단하며, 가장 권장되는 방식.
4.
Middleware로 인증 처리:
•
소켓의 handshake.auth에서 토큰을 추출해 검증.
•
인증 실패 시 next(err)를 호출해 연결 차단.
•
인증 성공 시 socket.data에 사용자 정보를 저장 가능.
5.
고급 응용:
•
중복 연결 방지: clientMap을 사용해 특정 사용자가 여러 소켓을 생성하는 것을 차단.
•
커스텀 데이터 추가: 인증된 사용자 정보를 socket.data에 저장해 이후 이벤트에서 활용.
6.
쿠키 인증:
•
withCredentials 옵션으로 클라이언트가 쿠키 기반 인증 지원.
3. 보충 설명
1) 인증 방식의 선택 기준
•
Guard는 이벤트마다 인증이 필요할 경우 적합:
◦
실시간 게임 서버에서 매 이벤트마다 사용자의 액션을 인증해야 하는 경우.
◦
보안 민감도가 높은 경우(예: 거래 내역, 금융 정보 전송 등).
•
Middleware는 연결 자체를 안전하게 관리할 때 적합:
◦
실시간 채팅, 알림 등 연결 후 지속적인 상태 관리가 필요한 경우.
◦
클라이언트와 서버 간 신뢰할 수 있는 연결을 보장해야 하는 상황.
2) 실시간 시스템에서의 Middleware의 장점
•
연결 효율성: 인증 실패한 클라이언트를 초기에 차단해 서버 리소스 절약.
•
보안 강화: 인증되지 않은 사용자가 이벤트를 발생시키기 전에 연결 자체를 차단.
•
유지보수성: 인증 로직을 분리해 Gateway 코드 간소화.
3) 추가 고려 사항
1.
JWT의 유효성 관리:
•
JWT의 유효기간(exp)을 확인해 만료된 토큰은 차단.
•
인증 미들웨어에서 토큰 재발급(Refresh Token) 로직을 추가 가능.
2.
HTTPS와 보안:
•
WebSocket에서 wss://(WebSocket Secure)를 사용해 데이터 암호화.
•
인증 토큰은 HTTPS를 통해 안전하게 전달.
3.
스케일링 지원:
•
다수의 서버에서 WebSocket을 사용할 경우 Redis, NATS, Kafka 등을 사용해 메시지 브로커를 구성.
•
socket.io-adapter를 활용해 여러 서버 간 소켓 연결 공유.
4) 응용 사례
1.
실시간 채팅 애플리케이션:
•
사용자가 로그인 시 JWT 인증 후 WebSocket 연결.
•
메시지 전송 시 socket.data에서 사용자 정보 활용.
2.
IoT 시스템:
•
IoT 기기 인증을 WebSocket Middleware에서 처리.
•
기기별 고유 토큰을 검증 후 연결 허용.
3.
멀티플레이어 게임 서버:
•
플레이어의 중복 연결 방지 및 액션 인증.
•
사용자 상태(위치, 아이템 등)를 socket.data에 저장.
결론
NestJS와 Socket.IO를 활용한 사용자 인증 구현은 실시간 시스템에서 효율적이고 안전한 통신을 가능하게 함. 특히, Middleware는 인증 로직을 초기 연결 단계에서 처리할 수 있어 보안성과 유지보수성을 모두 향상시킴.
응용 사례와 확장성을 고려하여 필요한 상황에 맞게 인증 방식을 선택하고 추가적인 보안을 설계하면 더 나은 시스템 구축이 가능.
안녕하세요
•
한국전자기술연구원 김영광입니다.
•
관련 기술 문의와 R&D 공동 연구 사업 관련 문의는 “glory@keti.re.kr”로 연락 부탁드립니다.
Hello 
•
I'm Yeonggwang Kim from the Korea Electronics Research Institute.
•
For technical and business inquiries, please contact me at “glory@keti.re.kr”