bibimbap/docs/maintenance/post-deploy-verification-ch...

7.1 KiB

kind title created_at session_id status related_change related_security_checklist
maintenance 배포 후 검증 체크리스트 — W3/W4 + 하드닝 b1/b2 (L3 deferred) 2026-06-29 20260629-142115 pending ../changes/2026-06-29-w3-w4-features.md ../security/security-remediation-checklist.md

배포 후 검증 체크리스트 — W3/W4 + 하드닝 b1/b2

L3 런타임 스모크는 세션 20260629-100849 및 20260629-142115 에서 자동 수행하지 않고 배포 후 과제로 이월한 항목이다. 이 문서는 실 dev 환경(WAR 기동 + 실 DB) 에서 수동 확인해야 할 체크리스트다.

관련 변경이력: 2026-06-29-w3-w4-features.md.


사전 조건

배포 전 아래 항목이 완료되어야 한다.

  • DB DDL 8종 적용 완료 (사용자 보고 수신 2026-06-29): tag/games-hub/board/game-upload/badge DDL 5종 + W2 jam DDL 3종을 db/apply-local-ddl.sh 로 실 dev DB 에 일괄 적용.
  • b2 자산 수동 이전 — 아래 §자산 수동 이전 참조. WAR 기동 전 수행 권장.

§자산 수동 이전 (b2 신규 저장루트)

application.properties 변경(app.upload.game-storage-path=${user.home}/.bibimbap/uploads)으로 업로드 저장루트가 static/ 트리 밖으로 이전됐다.

이전이 필요한 자산:

# 이전 경로 → 새 경로
src/main/resources/static/profile/8/   →   ~/.bibimbap/uploads/profile/8/
  • static/profile/8/ 에 user 8 프로필 이미지가 존재할 경우 새 경로로 수동 이전 필요.
  • 미이전 시: user 8 프로필 이미지 404 발생.
  • static/game/ 은 비어있으므로 게임 자산 이전 불필요.

이전 명령 예시 (디렉토리가 존재하는 경우):

mkdir -p ~/.bibimbap/uploads/profile/8
cp -r src/main/resources/static/profile/8/. ~/.bibimbap/uploads/profile/8/
# 확인 후 원본 삭제(선택)

완료 후 이 체크리스트 항목에 체크:

  • user 8 프로필 이미지 ~/.bibimbap/uploads/profile/8/ 에 존재 확인

§게임 좋아요 UNIQUE 마이그레이션 (세션 20260629-151216, DB 미적용)

게임 좋아요 서버 영속화(changes/2026-06-29-game-like-server-persistence.md)에서 game_likes (game_id, user_key) 중복을 막는 UNIQUE 제약을 db/migrations/20260629-game-likes-unique.sql 로 추가했으나 운영 DB 에는 아직 적용하지 않았다. 제약이 없으면 동시 더블클릭 시 중복 좋아요 row 가 생길 수 있다(애플리케이션 레벨 select-then-act + 단일 트랜잭션으로 1차 방어하나 DB 보증은 별도).

적용 절차 (중복 점검 게이트 선행 필수):

-- 1) 중복 row 점검 — 결과가 0건이어야 바로 ALTER 가능
SELECT game_id, user_key, COUNT(*) FROM game_likes
GROUP BY game_id, user_key HAVING COUNT(*) > 1;

-- 2) (중복이 있으면) 중복 제거 후 진행. 없으면 곧장 제약 추가
ALTER TABLE game_likes ADD CONSTRAINT uq_game_likes_game_user UNIQUE (game_id, user_key);
  • 롤백: ALTER TABLE game_likes DROP CONSTRAINT uq_game_likes_game_user;
  • (선택) 초기 정합 보정 — 기존 like_count 컬럼과 row 수 불일치 교정이 필요할 때만. 시드/레거시 카운트를 보존하려면 실행하지 않는다(본 기능 비목표):
    UPDATE games g SET like_count = COALESCE((SELECT COUNT(*) FROM game_likes gl WHERE gl.game_id = g.id), 0);
    

완료 후 체크:

  • 중복 점검 SELECT 0건 확인
  • uq_game_likes_game_user UNIQUE 제약 적용

L3 런타임 스모크 체크리스트

WAR 기동 후 아래 기능을 수동으로 확인한다.

1. 검색 (/games/search)

  • 태그 필터(단일/다중 AND/OR) 정상 동작
  • 정렬키 6종(최신/조회수/평점/리뷰수/잼연관 등) 전환 확인
  • 잼 필터(?jam=slug) 경유 잼 게임 목록 표시
  • 방문수 dedupe — 동일 사용자 짧은 interval 내 재방문 시 view_count 미증가 확인

2. 허브 (/)

  • keyset 페이징 더보기(스크롤/버튼) — 중복 없이 다음 페이지 로드
  • 진행중 잼 배너 표시 (JamsMapper.listActive/games/search?jam= 라우팅)
  • 게임카드 creator 배지 칩 표시 (이번 세션 신규 — WebMvcController creatorBadges 주입)

3. 포스팅 보드

  • 포스팅 작성 (POST_WRITE 권한 보유 계정으로 로그인 후 /posts/new)
  • 마크다운 sanitize 렌더 — XSS 시도(<script>) 차단 확인
  • OG 미리보기 (OgPreviewService) — 외부 URL 입력 후 og:title/og:image 렌더
  • 유니티 피드 폴링 — @Scheduled 실행 확인(로그 또는 unity_feed_items 테이블 증가)
  • ★실 HTTPS 외부 fetch — option-b hostname-connect 실 TLS 동작 확인 (단위는 HTTP mock만 사용했으므로 실 환경 필수)

4. 업로드 보안 (Unity WebGL)

  • zip-slip 시도 거부 확인 (../ 경로 포함 zip 업로드 → 거부)
  • 포맷 거부 — wasm/data/loader 파일 미포함 zip 거부
  • 정상 Unity 빌드 업로드 + replaceUuid 경로 교체 성공
  • 업로드물이 ~/.bibimbap/uploads/game/ 에 생성·서빙되는지 확인 (b2 신규 경로)

5. 배지 / 평판

  • 배지 자동부여 — 리뷰 10건 작성 후 Reviewer 배지 자동 부여
  • 배지 자동부여 — 게임 업로드 3건 후 Technician 배지 자동 부여
  • 수동 grant/revoke — BADGE_MANAGE 권한 계정으로 /manage/badges 접근 + grant/revoke 동작
  • 리뷰 작성자 배지 칩 — 게임 상세 리뷰 목록에서 리뷰어 배지 칩 표시
  • 프로필 myBadges 표시 (이번 세션 신규 — profile.jsp 본인 배지 주입)

5-1. 게임 좋아요 서버 영속화 (세션 20260629-151216 신규)

선행: 위 §게임 좋아요 UNIQUE 마이그레이션 적용 권장(미적용 상태로도 기능 동작은 가능).

  • 로그인 → 게임 상세 좋아요 클릭 → explore 페이지에서 해당 게임 카운트 +1 반영 확인 (AC-1 핵심 버그)
  • 같은 게임 두 번째 클릭 → 좋아요 취소(카운트 원복, game_likes row 0건) (AC-2 멱등 토글)
  • 좋아요한 게임 상세 재진입(다른 브라우저/시크릿창) → 버튼 aria-pressed="true" 초기 렌더 (AC-7, 서버 진실 — localStorage 무관)
  • 미로그인 상태 좋아요 클릭 → 401 + 로그인 유도(상태변경 0)

6. 보안 하드닝 b1 — SSRF DNS 캐시 TTL

  • ★SSRF ttl 런타임 반영 확인: 앱 기동 후 java.security.Security.getProperty("networkaddress.cache.ttl") 값이 "30" 인지 확인.
    • 반영됨: @PostConstruct initDnsCachePolicy() best-effort 성공.
    • 미반영 시 조치: JVM 레벨 설정으로 격상 — $JAVA_HOME/conf/security/java.securitynetworkaddress.cache.ttl=30 추가. (결정적 보장은 JVM 레벨이 정본.)

완료 기준

위 체크리스트 전항목 체크 + §자산 수동 이전 완료 시 L3 스모크 통과. 결과를 이 문서에 직접 기록하거나 관련 work-log 에 append.