정혜민

DQ 미래 역량 검사
DQ 미래 역량 검사

보안 설계

JWT 이중 인증, Rate Limiting, 요청 로깅 마스킹, 비밀번호 강제 변경 등 서비스 보안 체계 구축


요청Rate LimitIP당 10회/분학생 JWT 필터세션 ID 검증관리자 JWT 필터비밀번호 변경 게이트비즈니스 로직응답 로깅마스킹 처리

문제

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회)으로 설정했습니다.

로그에서 개인정보 노출이 차단되어, 운영 중 로그 조회 시 개인정보 보호 규정을 준수할 수 있게 되었습니다.