⚙️Backend

개인정보 유출 방지: 타 사용자 캐릭터 접근 제어 강화 백엔드

다른 사용자의 캐릭터 목표 설정 및 필사 사진 공개 이슈를 해결한 백엔드 개발 경험을 공유합니다.

📅 2026년 7월 31일·📖 5분 읽기·👁 5

다른 사용자의 캐릭터에 목표를 설정하거나 공개로 남아있던 필사 사진 및 표지를 잠그는 등 접근 제어가 미흡한 이슈가 있었습니다. 이 글은 당시 겪었던 문제를 어떻게 해결했는지, 그 과정에서 어떤 함정에 빠졌는지 솔직하게 기록한 내용입니다.

시도와 함정

홈 기능의 권한 감사 수행 결과, 타 사용자의 캐릭터 목표 설정 및 공개 필사 사진 노출과 같은 결함이 발견되었습니다. 처음에는 단순히 API 응답에 권한 체크 로직을 추가하는 것으로 해결될 줄 알았습니다.

# 기존 코드 (가정)
def set_character_goal(user_id, character_id, goal):
    # ... 캐릭터 정보 조회 ...
    return {"status": "success"}

def get_user_photos(user_id): # ... 사용자의 공개 필사 사진 조회 ... return {"photos": [...]}

하지만 이 방식으로는 이미 설정된 목표나 공개된 사진에 대한 접근 자체를 막지 못했습니다. 즉, API 레벨에서의 검증만으로는 부족하다는 것을 깨달았죠.

원인

문제의 근본 원인은 사용자 권한 관리 및 개인 정보 보호 시스템 전반의 설계 미흡이었습니다. 특정 기능에 대한 접근 제어만 신경 썼을 뿐, 데이터 자체의 공개 범위를 명확히 설정하고 관리하는 부분이 부족했습니다. 특히, 필사 사진이나 캐릭터 목표 설정 같은 민감한 정보가 의도치 않게 외부에 노출될 수 있는 구조였습니다.

해결

결국 사용자 권한 관리 및 개인 정보 보호 기능을 전반적으로 강화하는 방향으로 수정했습니다. API 레벨에서의 검증 강화는 물론, 데이터 모델 자체에 공개/비공개 설정을 추가하고, 이를 기반으로 접근 제어를 더욱 엄격하게 적용했습니다.

# 수정된 코드 (가정)
class Character:
    def __init__(self, character_id, owner_id, goal=None, is_public=False):
        self.character_id = character_id
        self.owner_id = owner_id
        self.goal = goal
        self.is_public = is_public # 공개/비공개 설정 추가

class Photo: def init(self, photo_id, owner_id, content, is_public=False): self.photo_id = photo_id self.owner_id = owner_id self.content = content self.is_public = is_public # 공개/비공개 설정 추가

def set_character_goal(requesting_user_id, character_id, goal): character = get_character(character_id) if character.owner_id != requesting_user_id: raise PermissionError("타 사용자의 캐릭터 목표를 설정할 수 없습니다.") if not character.is_public and goal is not None: # 비공개 캐릭터는 목표 설정 제한 raise PermissionError("비공개 캐릭터의 목표는 설정할 수 없습니다.") character.goal = goal save_character(character) return {"status": "success"}

def get_user_photos(requesting_user_id, target_user_id): photos = get_all_photos_for_user(target_user_id) return [photo for photo in photos if photo.is_public or photo.owner_id == requesting_user_id]

이렇게 데이터 자체에 공개 범위를 명시하고, 요청하는 사용자가 해당 데이터의 소유자이거나 명시적으로 공개된 경우에만 접근을 허용하도록 로직을 변경했습니다.

결과

  • 사용자 권한 관리 및 개인 정보 보호가 강화되었습니다.
  • 타 사용자의 캐릭터에 대한 의도치 않은 목표 설정이 차단되었습니다.
  • 공개로 설정되지 않은 필사 사진 및 표지가 외부로 노출되는 것을 방지했습니다.

정리 — 같은 함정 안 빠지려면

  • [ ] 서비스 출시 전, 사용자 권한 및 개인 정보 보호 관련 기능에 대한 철저한 감사를 수행한다.
  • [ ] 데이터 모델 설계 시, 민감 정보에 대한 공개/비공개 설정을 기본적으로 고려한다.
  • [ ] API 레벨의 접근 제어뿐만 아니라, 데이터 자체의 속성을 활용한 다층적인 보안을 적용한다.
  • [ ] 정기적인 보안 취약점 점검 프로세스를 구축하고 실행한다.

태그

#개인정보보호#접근제어#백엔드#API 보안#데이터 모델링#권한관리#개발회고