Skip to content

[Security] 공개 API에서 사용자 이메일 노출 문제 개선 요청 #134

@goalSetter09

Description

@goalSetter09

📋 문제 설명

현재 /api/public/posts/{id} 공개 API에서 게시글 작성자의 이메일 주소(userEmail)가 그대로 노출되고 있습니다. 이는 비로그인 사용자도 접근 가능한 엔드포인트에서 개인식별정보(PII)를 유출할 수 있는 보안 위험을 내포하고 있습니다.

🔍 현재 상황

문제가 되는 코드

파일: src/main/java/hanium/modic/backend/domain/post/service/PostService.java:114

@Transactional(readOnly = true)
public GetPostResponse getPostForPublic(final Long id) {
    // ... 다른 코드 ...
    final String userEmail = userEntity.getEmail(); // ⚠️ 이메일 그대로 노출
    // ... 다른 코드 ...
    return GetPostResponse.of(userName, hasUserImage, userImage, userEmail, postEntity, postImages, likeCount, isLikedByCurrentUser);
}

영향 범위

  • 엔드포인트: GET /api/public/posts/{id} - 인증 없이 접근 가능
  • 데이터: 게시글 작성자의 실제 이메일 주소
  • 위험성: 개인정보 수집, 스팸 메일, 피싱 등에 악용 가능

💡 해결 방안

🎯 권장안 A: 이메일 비노출 (추천)

공개 API에서는 이메일을 완전히 제거하여 개인정보를 보호합니다.

@Transactional(readOnly = true)
public GetPostResponse getPostForPublic(final Long id) {
    // ... 다른 코드 ...
-   final String userEmail = userEntity.getEmail();
+   // 공개 API: 이메일 비노출(PII 보호)
+   final String userEmail = null;
    // ... 다른 코드 ...
}

🔄 권장안 B: 이메일 마스킹 처리 (대안)

부분적 정보 제공이 필요한 경우 마스킹 처리를 적용합니다.

// 예시: user@example.com → u***@example.com
final String userEmail = maskEmail(userEntity.getEmail());

📝 수정 필요 파일

Backend

  • src/main/java/hanium/modic/backend/domain/post/service/PostService.java:114
    • getPostForPublic() 메서드에서 userEmail 처리 방식 변경

Test Files

  • src/test/java/hanium/modic/backend/domain/post/service/PostServiceTest.java
    • getPostForPublic 관련 테스트에서 이메일 검증 로직 수정
  • src/test/java/hanium/modic/backend/web/post/controller/PublicPostControllerTest.java
    • 이메일 필드 검증 테스트 수정

수정 예시 (테스트)

// Before
.andExpected(jsonPath("$.data.userEmail").value(mockUser.getEmail()));

// After (권장안 A 적용 시)
.andExpected(jsonPath("$.data.userEmail").isEmpty()); // null 검증

🏷️ 기대 효과

  • 개인정보 보호: 비로그인 사용자로부터 이메일 주소 보호
  • 보안 강화: PII 유출 위험 제거
  • GDPR 컴플라이언스: 개인정보 처리 최소화 원칙 준수
  • API 일관성: 공개 API vs 인증 API의 명확한 차별화

🔗 관련 정보


참고: 현재 구현은 기존 인증 API의 응답 구조를 재사용하고 있어 이메일이 포함되지만, 공개 API의 특성상 개인정보 보호를 우선시해야 합니다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requesttechdebt기술 부채, 당장은 필요 없지만 개선해야하는 것

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions