Skip to content

[보안/품질] 건강·알림 IDOR 방지, Security 정리, Flyway 및 통합 테스트 #39

Description

@RosieOh

배경

CareCode_Interface 코드베이스 검토(블랙박스·화이트박스) 결과, 건강 기록·알림 API에서 IDOR(타 사용자 리소스 접근) 위험이 확인되었고, Spring Security의 permitAll과 컨트롤러 단 @RequireAuthentication이 혼재되어 보안 정책이 이중으로 나뉘어 있었습니다. 또한 테스트·DB 마이그레이션·문서 정합성이 로드맵 대비 부족한 상태였습니다.

목표

  1. 건강 도메인: recordId·childId 기반 조회/수정/삭제·첨부 시 현재 로그인 사용자(이메일→User PK)와 리소스 소유자 일치를 서비스 계층에서 강제합니다.
  2. 알림 도메인: 알림 단건 조회·수정·삭제·읽음·배치 읽음 처리 시 수신자 userId와 인증 사용자 일치를 검증합니다. 기존 markAllAsRead() JPQL이 전역으로 동작하던 문제를 사용자 범위로 제한하는 리포지토리 메서드로 교체합니다.
  3. 보안 설정: /health/**authenticated()로 통일, Swagger·카카오 디버그 HTML은 비프로덕션 프로파일에서만 허용, 챗봇은 @PreAuthorize("isAuthenticated()")로 보강합니다.
  4. Flyway: 프로덕션에서 스키마 마이그레이션 체인을 시작할 수 있도록 baseline 마이그레이션과 프로파일별 enabled 설정을 추가합니다.
  5. 테스트·CI: Testcontainers(MariaDB) 기반 통합 스모크 테스트, Jacoco 라인 커버리지 게이트(BUNDLE), Flyway 의존성을 반영합니다.
  6. 문서: README의 토큰 갱신 경로를 실제 /auth/refresh와 맞춥니다.

수용 기준 (Acceptance Criteria)

  • 타 사용자 recordId로 건강 기록 조회 시 403 Forbidden (또는 동등한 비즈니스 예외).
  • 타 사용자 notificationId로 알림 조회 시 403.
  • NotificationMarkAsReadRequest로 일괄 읽음 시 본인 알림만 업데이트됨 (전역 UPDATE 없음).
  • ./gradlew test jacocoTestCoverageVerification 성공.
  • 프로덕션 프로파일에서 Flyway 활성화, 개발에서는 비활성화.

참고 파일

  • HealthService.java, HealthFacade.java, HealthController.java
  • NotificationService.java, NotificationRepository.java, NotificationFacade.java, NotificationController.java
  • SecurityConfig.java, ChatbotController.java
  • application.yml, application-dev.yml, application-prod.yml, db/migration/V1__baseline.sql
  • build.gradle, CareCodeMariaDbIntegrationTest.java, HealthServiceTest.java
  • README.md

비고

  • 전체 애플리케이션 컨텍스트를 H2로 기동하는 테스트는 일부 네이티브/날짜 쿼리 검증과 충돌하여 제거하고, Docker 기반 MariaDB 통합 테스트로 대체합니다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions