POP-SPOT v2.22 (1/3) — IDOR 인가 누락 + 저장형 XSS + 메모리/스토리지 누수 일괄 수정
v2.22 릴리즈에 포함된 Git 기록을 빠짐없이 펼친 기술 기록이다. 전문 용어는 바로 풀어 쓰고, 바뀐 모든 코드 줄을 Before → After로 비교했다.
먼저 쉽게 설명하면
IDOR 인가 누락 + 저장형 XSS + 메모리/스토리지 누수 일괄 수정 작업이 중심이다. 이 릴리즈는 눈에 보이는 결과뿐 아니라 그 결과를 만든 파일과 코드까지 모두 추적했다.
읽는 법
Git 기준 범위
커밋 8d5b58c — feat(v2.21-S2): BROWSE 칩 → 지도 필터 연동 + 자동수집 신뢰도 0.8 필터변경 파일 4개
쉬운 설명: BROWSE 칩 → 지도 필터 연동 + 자동수집 신뢰도 0.8 필터 작업이다.
바꾼 이유: 문제 1 — BROWSE 칩 클릭해도 지도 무반응 (v2.21-S1 의 후속). InteractiveMap 가 /api/popups?category= 만 호출하고 region/period 쿼리 무시. 데이터 소스도 BROWSE 의 /api/map/markers 와 분리되어 일관성 없음.
파일 수: 4개이다.
파일 1. PROJECT_CHANGELOG.md
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-backend/src/main/java/com/example/popspotbackend/service/PopupStoreService.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 3. popspot-frontend/src/components/Map/InteractiveMap.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 4. popspot-frontend/src/lib/popupSlices.ts
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 b883239 — feat(v2.21-S3): 자동수집 캐시 즉시 갱신 + 신뢰도 환경변수 + Long-tail SEO 랜딩변경 파일 7개
쉬운 설명: 자동수집 캐시 즉시 갱신 + 신뢰도 환경변수 + Long-tail 검색 결과 노출 랜딩 작업이다.
바꾼 이유: 운영자 요청 3종 묶음.
파일 수: 7개이다.
파일 1. PROJECT_CHANGELOG.md
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. README.md
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 3. popspot-backend/src/main/java/com/example/popspotbackend/service/PopupStoreService.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 4. popspot-backend/src/main/java/com/example/popspotbackend/service/crawler/PopupCrawlScheduler.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 5. popspot-backend/src/main/resources/application.properties
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 6. popspot-frontend/app/popups/[slug]/page.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 7. popspot-frontend/app/sitemap.ts
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 8d246ae — fix(v2.21-S3.1): /popups/[slug] segment config 충돌 핫픽스변경 파일 1개
쉬운 설명: /popups/[slug] segment config 충돌 핫픽스 작업이다.
바꾼 이유: Vercel 빌드 실패 — Next.js 16 segment config 에서 dynamic="force-static" 과 revalidate 가 함께 export 되면 충돌 (Invalid segment configuration).
파일 수: 1개이다.
파일 1. popspot-frontend/app/popups/[slug]/page.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 981435b — fix(v2.21-S3.2): segment config 는 literal 값만 — REVALIDATE_SECONDS 인라인변경 파일 1개
쉬운 설명: segment config 는 literal 값만 — REVALIDATE_SECONDS 인라인 작업이다.
바꾼 이유: Vercel 빌드 재실패 — Next.js 16 의 segment config (revalidate / dynamicParams / dynamic) export 는 정적 분석 가능한 literal 값만 허용. const 변수 참조는 build-time analyzer 가 못 읽어 "Invalid segment configuration" 으로 reject.
파일 수: 1개이다.
파일 1. popspot-frontend/app/popups/[slug]/page.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 2b36578 — fix(v2.21-S3.3): BROWSE 칩 router.push → next/link Link 로 교체변경 파일 1개
쉬운 설명: BROWSE 칩 router.push → next/link Link 로 교체 작업이다.
바꾼 이유: 증상: BROWSE 칩 클릭 시 URL 은 바뀌는데 지도 필터가 안 들어감.
파일 수: 1개이다.
파일 1. popspot-frontend/src/components/main/BrowseSection.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 7868543 — feat(v2.21-S3.4): BROWSE 칩 → 모달 리스트 → 페이지 진입 흐름으로 변경변경 파일 1개
쉬운 설명: BROWSE 칩 → 모달 리스트 → 페이지 진입 흐름으로 변경 작업이다.
바꾼 이유: 배경: v2.21-S3.3 의 next/link Link 교체 후에도 같은 페이지 query 변경 시 화면이 갱신 안 됨. Next.js router cache + useSearchParams 의 reactive 한계로 같은 segment 안에서 query 만 바뀔 때 컴포넌트 트리 재실행이 보장되지 않는 알려진 케이스. 라우팅 의존성 자체를 빼는 게 정답.
파일 수: 1개이다.
파일 1. popspot-frontend/src/components/main/BrowseSection.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 7fab8cc — fix(v2.21-S3.5): InteractiveMap 핀 안 보이는 회귀 — useSearchParams 제거변경 파일 1개
쉬운 설명: InteractiveMap 핀 안 보이는 회귀 — useSearchParams 제거 작업이다.
바꾼 이유: 증상: 지도에 핀이 0개. /api/map/markers 응답은 정상 (curl 확인) 인데 프론트가 마커를 안 그림.
파일 수: 1개이다.
파일 1. popspot-frontend/src/components/Map/InteractiveMap.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 36b5335 — fix(v2.21-S4): 사용자 노출 신뢰도 게이트 제거 (운영자 결정 롤백)변경 파일 3개
쉬운 설명: 사용자 노출 신뢰도 게이트 제거 (운영자 결정 롤백) 작업이다.
바꾼 이유: 배경: v2.21-S2/S3 의 신뢰도 0.8 미만 차단이 운영 중 핀 누락 부작용을 일으켜 운영자가 "지도 핀이 안 보인다" 보고. 자동수집 시점의 popspot.crawler.confidence-threshold 가 이미 자동게시 vs 검수큐 분기를 처리하므로 사용자 노출 단계의 추가 게이트는 중복 + 부작용만 큼.
파일 수: 3개이다.
파일 1. PROJECT_CHANGELOG.md
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-backend/src/main/java/com/example/popspotbackend/service/PopupStoreService.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 3. popspot-backend/src/main/resources/application.properties
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 575e1a4 — feat(v2.21-S5): BROWSE 토글 + 동적 시점 라벨 + 인라인 통합검색변경 파일 4개
쉬운 설명: BROWSE 토글 + 동적 시점 라벨 + 인라인 통합검색 작업이다.
바꾼 이유: 1) BROWSE 섹션 접/펴 토글 - 헤더 클릭 → 본문 (지역/시점/카테고리 칩) 접고 펴기. framer-motion height/opacity 애니메이션. - ChevronUp / ChevronDown 아이콘으로 상태 표시. - localStorage(popspot:browse:expanded) 영속화 → 새로고침 후에도 사용자 선택 유지.
파일 수: 4개이다.
파일 1. popspot-frontend/src/components/layout/Header.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-frontend/src/components/layout/InlineGlobalSearch.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 3. popspot-frontend/src/components/main/BrowseSection.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 4. popspot-frontend/src/lib/popupSlices.ts
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 ec9dc06 — feat(v2.21-S6): 음악 재생 실패 자동 skip + Ctrl+K 단축키 + BROWSE 카드 디자인 차별화변경 파일 4개
쉬운 설명: 음악 재생 실패 자동 skip + Ctrl+K 단축키 + BROWSE 카드 디자인 차별화 작업이다.
바꾼 이유: 핵심 — 음악 재생 실패 graceful 처리
파일 수: 4개이다.
파일 1. popspot-frontend/src/components/layout/InlineGlobalSearch.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-frontend/src/components/main/BrowseSection.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 3. popspot-frontend/src/components/music/MusicPlayerProvider.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 4. popspot-frontend/src/components/music/useYouTubePlayer.ts
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 af0f8f4 — fix(v2.21-S7): MusicTrack.title 빌드 에러 핫픽스 + playback-failed 백엔드 endpoint변경 파일 6개
쉬운 설명: MusicTrack.title 빌드 에러 핫픽스 + playback-failed 백엔드 endpoint 작업이다.
바꾼 이유: 1) 빌드 에러 핫픽스 - MusicPlayerProvider.tsx: failed.title → failed.trackName (MusicTrack 의 실제 필드는 trackName. title 은 없음).
파일 수: 6개이다.
파일 1. popspot-backend/src/main/java/com/example/popspotbackend/controller/MusicController.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-backend/src/main/java/com/example/popspotbackend/entity/MusicTrack.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 3. popspot-backend/src/main/java/com/example/popspotbackend/repository/MusicTrackRepository.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 4. popspot-backend/src/main/java/com/example/popspotbackend/service/music/MusicService.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 5. popspot-backend/src/main/resources/db/migration/V12__music_track_playback_failed.sql
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 6. popspot-frontend/src/components/music/MusicPlayerProvider.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 981f8d4 — fix(v2.21-S8): YouTube IFrame API 가 CSP script-src 에 막혀 음악 재생 안 되던 진짜 원인 해결변경 파일 1개
쉬운 설명: YouTube IFrame 화면과 서버가 데이터를 주고받는 통로 가 CSP script-src 에 막혀 음악 재생 안 되던 진짜 원인 해결 작업이다.
바꾼 이유: 증상: 사용자가 "음악 재생 안 되는 게 수두룩하다" 보고. 디버깅 결과 브라우저 콘솔에:
파일 수: 1개이다.
파일 1. popspot-frontend/next.config.ts
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 27b1bf9 — feat(v2.21-S9): 비공식 변형 차단 키워드 30개 추가 + 매칭 0 fallback변경 파일 2개
쉬운 설명: 비공식 변형 차단 키워드 30개 추가 + 매칭 0 앞선 방법이 실패할 때 쓰는 대체 방법 작업이다.
바꾼 이유: 배경: 사용자가 "노래가 나와야 하는데 가끔 피아노 / 오르골 / 자장가 / 슬로우 같은 이상한 커버곡이 나옴" 보고. v2.14 도입한 NON_OFFICIAL_KEYWORDS 가 cover/live/ remix/acoustic 까지만 잡았던 한계.
파일 수: 2개이다.
파일 1. popspot-backend/src/main/java/com/example/popspotbackend/service/music/YouTubeMusicSearchService.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-frontend/src/components/music/MusicPlayerProvider.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 ee7a2f8 — feat(v2.21-S10): Spotify OAuth 백엔드 (Phase 1/5)변경 파일 0개
쉬운 설명: Spotify 외부 계정 로그인 백엔드 (Phase 1/5) 작업이다.
바꾼 이유: Premium 사용자 풀트랙 깨끗 음원 + Free 사용자 30초 preview 시스템의 첫 단계. 이번 commit 은 백엔드 OAuth + 토큰 저장 + 자동 refresh 만. 프론트 UI / SDK 통합은 S11-S14 후속.
파일 수: 8개이다.