(주)사운드마인드
통합 로그인 서버
여러 서비스가 하나의 계정을 공유합니다. 보호자와 자녀 단말은 네트워크 사정이 정반대라, 로그인 유지 정책부터 둘로 갈라야 했습니다.
- 역할
- 백엔드 · 운영 대시보드
- 기간
- 2025.07 ~ 현재
- 사용 기술
- Spring BootJava 17MariaDBRedisNext.js
개선 결과
즉시 무효화
토큰 재사용 감지 시 계정 토큰 전체 폐기
2종
사용자 유형별로 분리한 토큰 정책
01문제
보호자는 일반 스마트폰에서 자주 접속하니 짧은 토큰을 계속 갱신하는 표준 방식이 맞습니다. 그런데 자녀 단말은 관리 정책으로 네트워크가 평소 닫혀 있어 갱신 요청 자체가 자주 실패합니다. 같은 정책을 쓰면 자녀 단말이 수시로 로그아웃되고, 그렇다고 전부 긴 토큰을 주면 탈취당했을 때의 피해가 커집니다.
02결정
유형별로 정책을 갈랐습니다. 보호자는 단기 토큰과 회전형 갱신 토큰을 쓰고, 갱신 토큰이 재사용되면 탈취로 간주해 그 계정의 토큰 계보 전체를 즉시 무효화하고 기록을 남깁니다. 자녀 단말은 갱신 없이 장기 단일 세션으로 유지하되 세션 수를 제한합니다. 서비스 간 인증 이벤트는 재시도와 보관함을 거쳐 관리자가 복구할 수 있게 했습니다.
- 보호자: 단기 토큰 + 회전형 갱신, 재사용 감지 시 계보 전체 폐기와 감사 기록
- 자녀 단말: 장기 단일 세션, 동시 세션 수 제한
- 서비스 간 알림은 지수 백오프 재시도 후 실패분을 보관해 수동 재처리 가능
- 변경된 서비스만 골라 빌드·배포하는 스크립트와 모니터링 스택 구성
03로그인 하나에서 계정 플랫폼으로
시작은 로그인 서버였지만, 자사 서비스가 하나씩 합류하면서 요구가 계정 플랫폼으로 자랐습니다. 새 서비스가 들어올 때마다 코드를 고치는 방식으로는 버틸 수 없어, 합류·연동·전파·정리를 각각 구조로 만들었습니다.
하나의 계정, 여러 제품
제품은 등록으로 합류하고, 사건은 웹훅으로 전파되며, 실패한 이벤트는 사라지지 않고 보관됩니다
서비스 합류는 등록으로
새 제품은 코드 수정이 아니라 등록으로 합류합니다. 클라이언트 식별자와 API 키, 허용 IP, 리다이렉트 주소를 DB에 등록하면 끝이고, CORS 허용 목록도 그 등록에서 동적으로 만들어집니다. 등록이 곧 정책입니다
가족 연동 원장
보호자와 자녀의 연동 요청·수락·해제를 SSO가 원장으로 관리합니다. 어느 제품에서 연동해도 같은 관계를 모두가 공유하고, 연동 수는 양쪽 모두 상한을 둡니다
인증 이벤트 전파
연동과 탈퇴 같은 사건은 각 서비스로 웹훅으로 전파됩니다. 멱등키를 붙여 지수 백오프로 세 번 재시도하고, 그래도 실패하면 보관함에 남겨 관리자가 다시 보낼 수 있습니다. 이벤트가 조용히 사라지는 일이 없습니다
계정 라이프사이클
휴면 전환, 파기 예고와 파기, 본인인증 정보의 보존 기한을 배치가 자동으로 처리합니다. 개인정보 정리가 운영자의 기억이 아니라 스케줄에 걸려 있습니다
운영 대시보드
회원 조회, 세션 강제 종료, 웹훅 보관함 재처리, 감사 로그까지 별도 대시보드에서 처리합니다. 장애 대응이 DB 콘솔이 아니라 화면에서 끝납니다
04결과
자녀 단말이 네트워크 사정으로 로그아웃되는 일이 사라졌고, 토큰 탈취 시나리오에는 재사용 감지 즉시 계정 단위로 차단됩니다. 운영 대시보드에서 세션 목록 확인과 강제 종료까지 처리할 수 있습니다.