{
  "issueId": "4071",
  "environment": "dev",
  "source": "Redmine #4071 and user-provided QA checklist",
  "scenario": "fail2ban-policy",
  "sourceText": "#4071 개발계 QA 요청. 대상은 비스킷링크 전산 IP 차단 관리 > BAN 로그이며 ADMIN과 TA만 검증한다. ADMIN 정책은 NONE, TA 테넌트 정책은 EMAIL이다. 현재 정책을 변경하지 않는다. 계정/비밀번호/로그인 2차 인증번호/이메일 인증번호는 로컬 secret으로만 사용하며 산출물에 기록하지 않는다. BAN 로그 SMS 인증 및 ADMIN SMS 전화번호 검증은 제외한다.",
  "scope": "개발계 비스킷링크 전산 IP 차단 관리 > BAN 로그에서 당월 데이터 및 인증 전 무한 스크롤용 2026-04-01~2026-09-11 확장 조회 기준 ADMIN(NONE)과 TA(EMAIL)의 사용자 ID 마스킹/원문 조회 정책, 인증 전후 상태 유지·폐기·재요청·만료 동작 검증",
  "checklist": [
    "1. ADMIN과 TA 모두 BAN 로그 최초 조회 시 사용자 ID가 마스킹되는지 확인",
    "2. 인증 전 검색, 새로고침, 페이지 이동 후에도 마스킹이 유지되는지 확인",
    "3. ADMIN(NONE)에서 사용자 ID 원문 조회 클릭 시 이메일 인증창 없이 즉시 원문 표시 및 버튼 전환 확인",
    "4. ADMIN 원문 상태에서 검색/페이지 이동 후 유효 세션 동안 원문 상태 유지 확인",
    "5. ADMIN 수동 마스킹 후 새로고침/검색 시 재노출되지 않고 재요청 때만 즉시 원문 전환 확인",
    "6. TA(EMAIL) 원문 조회 요청 시 이메일 인증창, 마스킹된 수신 이메일, 인증번호 유효시간 표시 확인",
    "7. TA 인증창 빈 값/6자리 미만/잘못된 인증번호 거부 및 원문 미노출 확인",
    "8. TA 정상 이메일 인증번호 입력 후 성공 안내, 원문 표시, 버튼 전환 확인",
    "9. TA 원문 상태에서 검색/페이지 이동 시 유효시간 동안 원문 유지 확인",
    "10. TA 수동 마스킹 시 즉시 재마스킹, 서버 인증 세션 폐기, 재요청 시 새 이메일 인증 필요 확인",
    "11. TA 미인증 인증창 종료 후 재요청 시 새 인증 절차 시작 확인",
    "12. 인증 세션 만료 후 자동 마스킹 전환 및 안내 확인",
    "13. ADMIN과 TA 정책이 뒤바뀌지 않는지 확인"
  ],
  "roles": ["ADMIN", "TA"],
  "routeCandidates": "../../../../qa-results/issues/4071/dev/route-candidates.json",
  "setupSteps": [
    {
      "name": "현재 사용자 원문 조회 정책과 동일 테넌트 확인",
      "kind": "state-verify",
      "role": "ADMIN",
      "application": "admin",
      "targetRoles": ["TA"],
      "description": "정책은 변경하지 않고 ADMIN NONE, TA EMAIL 설정과 두 계정의 동일 테넌트 범위를 실제 화면 흐름으로 검증한다.",
      "required": true,
      "mutation": "none",
      "navigation": { "name": "IP 차단관리 > BAN 로그", "path": "/admin/ip-block-manage?tab=BAN_LOG" },
      "restore": { "required": false, "description": "조회 전용 QA로 설정 변경 없음" }
    },
    {
      "name": "당월 사용자 ID 포함 BAN 로그 데이터 확인",
      "kind": "state-verify",
      "role": "ADMIN",
      "application": "admin",
      "targetRoles": ["TA"],
      "description": "당월 조회 결과에서 마스킹/원문을 비교할 수 있는 로그인ID 데이터가 존재하는지 확인한다.",
      "required": true,
      "mutation": "none",
      "navigation": { "name": "IP 차단관리 > BAN 로그", "path": "/admin/ip-block-manage?tab=BAN_LOG" },
      "restore": { "required": false, "description": "조회 전용 QA로 데이터 변경 없음" }
    }
  ],
  "pages": [
    {
      "name": "IP 차단관리 > BAN 로그",
      "application": "admin",
      "path": "/admin/ip-block-manage",
      "tenantParam": "tenantId",
      "roles": ["ADMIN", "TA"],
      "searchButtonSelector": "button:has-text('검색')",
      "dataRequestUrlPattern": "/api/v1/admin/fail2ban/ban-log",
      "filters": [
        { "name": "조회일", "selector": "input[type='date']", "type": "date", "value": "2026-09-01", "queryParamCandidates": ["from"] },
        { "name": "종료일", "selector": "input[type='date']", "type": "date", "value": "2026-09-11", "queryParamCandidates": ["to"] }
      ]
    }
  ]
}
