보안 설계
JWT 이중 인증, Rate Limiting, 요청 로깅 마스킹, 비밀번호 강제 변경 등 서비스 보안 체계 구축
문제
DQ는 초등학생부터 중학생까지 사용하는 교육 서비스입니다. 학생 개인정보와 검사 결과를 다루기 때문에 보안이 특히 중요했습니다.
학생용 앱과 관리자용 앱이 같은 DB를 공유하면서 서로 다른 인증 체계가 필요했고, 로그인 없이 접근 가능한 체험 페이지는 악용 방지가 필요했습니다. 또한 HTTP 요청/응답 로그에 개인정보가 그대로 남는 문제도 있었습니다.
해결
학생용(SecurityAppJwtFilter)과 관리자용(SecurityAdminJwtFilter) JWT 필터를 분리했습니다. 학생 필터는 토큰의 세션 ID와 DB의 현재 세션 ID를 비교해 동일 계정의 다중 기기 로그인을 차단합니다. 관리자 필터는 임시 비밀번호 사용 시 비밀번호 변경 API 외 모든 요청을 차단하는 강제 변경 게이트를 포함합니다.
로그인 없이 접근 가능한 체험 페이지(/app/exhibition)에는 IP 기반 Rate Limiting을 적용했습니다. ConcurrentHashMap으로 IP별 분당 요청 수를 추적하고, 10회를 초과하면 요청을 차단합니다.
HTTP 요청/응답 로깅 필터(HttpLoggingFilter)를 구현하되, 응답 본문에 포함된 개인정보(이름, 전화번호 등)는 AccesslogMaskingResponseBodyAdvice로 마스킹 처리했습니다. 민감한 엔드포인트는 설정 파일(http-logging.exclude-uris)로 로깅 자체를 제외할 수 있습니다.
공유 리포트의 토큰은 SecureRandom으로 생성하고, TTL 기반 만료 시각을 설정해 유효 기간이 지나면 자동으로 접근이 차단됩니다.
성과
학생/관리자 인증 경로가 완전히 분리되어, 한쪽의 보안 정책 변경이 다른 쪽에 영향을 주지 않습니다.
체험 페이지 악용 시도를 Rate Limiting으로 차단하면서도, 정상적인 사용에는 영향이 없는 수준(분당 10회)으로 설정했습니다.
로그에서 개인정보 노출이 차단되어, 운영 중 로그 조회 시 개인정보 보호 규정을 준수할 수 있게 되었습니다.
Other Topics
LLM 자동 채점 파이프라인
Gemini, OpenAI, Claude 3사 12종 모델을 추상화한 논서술형 답변 자동 채점 시스템
트랜잭션 분리 설계
LLM 호출 트랜잭션 분리로 DB 커넥션 고갈 장애 해결
동시성 제어 및 폴백 설계
채점 전용 스레드풀 격리 및 LLM 3단 폴백 재시도 구조
LLM 안전성 설계
환각, 형식 이탈, 프롬프트 인젝션 방어 체계 구축
AI 1인 개발 체계
Claude 스킬 기반 역할별 에이전트 하네스로 1인 풀스택 개발 체계 구축
AWS 인프라 및 CI/CD
ALB, private EC2, RDS, ElastiCache Redis 3노드 구성 및 월 비용 37% 절감
논서술형 풀이 활동 로그
문항별 진입/이탈/답변 변경 이력을 기록하여 학생의 풀이 과정을 추적하는 시스템