본문 바로가기

사이드 프로젝트/co-op.project3

알림 구현(2) 웹소켓 세션 다중 클라이언트, 다중 인스턴스 환경 개요실시간 알림에 사용되는 웹 소켓 세션이 현재는 다중 클라이언트와, 다중 인스턴스 환경에서 취약점을 보이고있다.1. pc로 접속한 뒤 모바일로 접속하면 pc환경에서의 세션은 끊기고,2. 중앙화된 세션 관리 저장소가 없어서 요청마다 세션 상태가 다르다. 오늘은 이 두개를 보완해보장  다중 클라이언트 허용현재 세션은 이렇게 HashMap 형태로 딱 하나만 들어가게끔 설계되어있는데, 자료구조를 좀 바꿔서한 Id에 대해 여러 웹소켓세션을 저장하도록 하면 된다.이렇게 thread safe한 불변 리스트를 사용하도록 바꿔주고websocket king client에서 두 개의 클라이언트를 켜놓고 실험해보면,같은 알림을 동시에 받는 걸 확인할 수 있다~!  다중 인스턴스 환경현재 websocket세션은 각 인스턴스의.. 2025. 4. 11.
알림 구현(1) Kafka + Redis Pub/Sub + WebSocket MVP 개요이번 프로젝트에서 나는 "알림 기능" 파트를 맡게 되었다. 프로젝트 주제는 실시간 게임 매칭 + 게임 공략글 공유 웹서비스이며, 알림은 전반적인 UX의 핵심 기능 중 하나였다. 알림은 두 가지 방향으로 나눠서 설계하기로 했다.RDB 기반 알림: 로그인 시 확인할 수 있는 알림 목록, 읽음 처리 등 상태 저장용, 푸시 알림이 유실되면(상대 사용자가 WebSocket Session이 없으면) 이곳에 모은다.푸시 기반 알림: 실시간 반응성과 UX 중심의 알림(브라우저 푸시)우선 RDB 연동 없이 "글에 달린 댓글"의 실시간 알림 스트리밍 기능 MVP부터 구현하였다. 이 글은 그 과정을 정리한 것이다.  구성1. 모든 유저는 웹 로그인 시 WebSocketSession을 부여받는다.클라이언트에서 /ws?to.. 2025. 4. 7.
JWT Token BlackList TTL을 효율적으로 설정하기 개요기존에는 BlackList의 TTL을 대강 AccessToken의 Exp기간과 똑같이 잡았었는데,유저가 만료시간 직전에 로그아웃을 하는 경우 Redis에 불필요하게 오랫동안 BlackList를 저장하게 된다. 30분짜리 AccessToken의 만료시간이 1분 남았을 때,블랙리스트로 30분간 저장해놓게 된다면 29분간 쓸모없는 데이터가 생기는 것이다. 솔직히 블랙리스트 하나 당 216B밖에 되지 않아서 무시해도 될 수준 아닌가? 싶지만, 100만건이 한번에 몰리면 216MB가 된다.거기다 우리는 RefreshToken도 Redis로 관리하므로 함께 생각하는 편이 좋다.  해결public void addToBlackList(String token) { String blackPrefix = jwtSe.. 2025. 4. 3.