배경
CareCode_Interface 코드베이스 검토(블랙박스·화이트박스) 결과, 건강 기록·알림 API에서 IDOR(타 사용자 리소스 접근) 위험이 확인되었고, Spring Security의 permitAll과 컨트롤러 단 @RequireAuthentication이 혼재되어 보안 정책이 이중으로 나뉘어 있었습니다. 또한 테스트·DB 마이그레이션·문서 정합성이 로드맵 대비 부족한 상태였습니다.
목표
- 건강 도메인:
recordId·childId 기반 조회/수정/삭제·첨부 시 현재 로그인 사용자(이메일→User PK)와 리소스 소유자 일치를 서비스 계층에서 강제합니다. - 알림 도메인: 알림 단건 조회·수정·삭제·읽음·배치 읽음 처리 시 수신자
userId와 인증 사용자 일치를 검증합니다. 기존 markAllAsRead() JPQL이 전역으로 동작하던 문제를 사용자 범위로 제한하는 리포지토리 메서드로 교체합니다. - 보안 설정:
/health/**는 authenticated()로 통일, Swagger·카카오 디버그 HTML은 비프로덕션 프로파일에서만 허용, 챗봇은 @PreAuthorize("isAuthenticated()")로 보강합니다. - Flyway: 프로덕션에서 스키마 마이그레이션 체인을 시작할 수 있도록 baseline 마이그레이션과 프로파일별
enabled 설정을 추가합니다. - 테스트·CI: Testcontainers(MariaDB) 기반 통합 스모크 테스트, Jacoco 라인 커버리지 게이트(BUNDLE), Flyway 의존성을 반영합니다.
- 문서: README의 토큰 갱신 경로를 실제
/auth/refresh와 맞춥니다.
수용 기준 (Acceptance Criteria)
참고 파일
HealthService.java, HealthFacade.java, HealthController.javaNotificationService.java, NotificationRepository.java, NotificationFacade.java, NotificationController.javaSecurityConfig.java, ChatbotController.javaapplication.yml, application-dev.yml, application-prod.yml, db/migration/V1__baseline.sqlbuild.gradle, CareCodeMariaDbIntegrationTest.java, HealthServiceTest.javaREADME.md
비고
- 전체 애플리케이션 컨텍스트를 H2로 기동하는 테스트는 일부 네이티브/날짜 쿼리 검증과 충돌하여 제거하고, Docker 기반 MariaDB 통합 테스트로 대체합니다.
배경
CareCode_Interface 코드베이스 검토(블랙박스·화이트박스) 결과, 건강 기록·알림 API에서 IDOR(타 사용자 리소스 접근) 위험이 확인되었고, Spring Security의
permitAll과 컨트롤러 단@RequireAuthentication이 혼재되어 보안 정책이 이중으로 나뉘어 있었습니다. 또한 테스트·DB 마이그레이션·문서 정합성이 로드맵 대비 부족한 상태였습니다.목표
recordId·childId기반 조회/수정/삭제·첨부 시 현재 로그인 사용자(이메일→User PK)와 리소스 소유자 일치를 서비스 계층에서 강제합니다.userId와 인증 사용자 일치를 검증합니다. 기존markAllAsRead()JPQL이 전역으로 동작하던 문제를 사용자 범위로 제한하는 리포지토리 메서드로 교체합니다./health/**는authenticated()로 통일, Swagger·카카오 디버그 HTML은 비프로덕션 프로파일에서만 허용, 챗봇은@PreAuthorize("isAuthenticated()")로 보강합니다.enabled설정을 추가합니다./auth/refresh와 맞춥니다.수용 기준 (Acceptance Criteria)
recordId로 건강 기록 조회 시 403 Forbidden (또는 동등한 비즈니스 예외).notificationId로 알림 조회 시 403.NotificationMarkAsReadRequest로 일괄 읽음 시 본인 알림만 업데이트됨 (전역UPDATE없음)../gradlew test jacocoTestCoverageVerification성공.참고 파일
HealthService.java,HealthFacade.java,HealthController.javaNotificationService.java,NotificationRepository.java,NotificationFacade.java,NotificationController.javaSecurityConfig.java,ChatbotController.javaapplication.yml,application-dev.yml,application-prod.yml,db/migration/V1__baseline.sqlbuild.gradle,CareCodeMariaDbIntegrationTest.java,HealthServiceTest.javaREADME.md비고