{
  "issueId": "3823",
  "environment": "dev",
  "scenario": "fail2ban-policy",
  "source": "Redmine #3823 + user-provided QA checklist 2026-07-29",
  "sourceText": "송인준님의 QA 요청입니다. 부서 설정 관리에서 Fail2ban 로그인 실패/Account Spraying 정책과 화이트리스트 범위를 설정하고, 실제 로그인 실패를 통해 기간형·반복·영구 BAN, 권한별 403, 차단 해제 흐름을 검증합니다.",
  "scope": "개발계 기본 ADMIN 정책 관리 권한과 기본 BO/CO/VE 로그인 계정을 사용해 Fail2ban 정책 저장·수정, 로그인 실패 및 Account Spraying 차단, 화이트리스트 범위, 기간형/영구 BAN, 수동 차단 해제를 자동 검증하고 원래 설정을 복원한다.",
  "roles": [
    "ADMIN"
  ],
  "subjectAccounts": [
    {
      "role": "ADMIN",
      "label": "기본 개발계 ADMIN",
      "envRole": "ADMIN"
    },
    {
      "role": "BO",
      "label": "기본 개발계 BO",
      "envRole": "BO"
    },
    {
      "role": "CO",
      "label": "기본 개발계 CO",
      "envRole": "CO"
    },
    {
      "role": "VE",
      "label": "기본 개발계 VE",
      "envRole": "VE"
    }
  ],
  "checklist": [
    "저장 후 설정값 정상 표시",
    "정책 수정 가능",
    "로그인 실패 정책 ON/OFF 동작",
    "Account Spraying 정책 ON/OFF 동작",
    "로그인 실패 횟수 초과 시 차단",
    "서로 다른 계정 수 초과 시 차단",
    "동일 계정 반복 실패 중복 집계 제외",
    "tenantId가 달라도 동일 IP 기준 합산",
    "기간형 BAN 만료 후 정상 로그인",
    "영구 BAN 동작",
    "최초 BAN 시간 적용",
    "반복 BAN 시간 증가",
    "설정 회차 이후 영구 BAN",
    "예외 없음 scope에서 두 정책 적용",
    "로그인 실패 정책 whitelist 동작",
    "Account Spraying whitelist 동작",
    "전체 Fail2ban whitelist 동작",
    "BAN 중 올바른 비밀번호 입력 시에도 403",
    "차단 해제 후 정상 로그인"
  ],
  "setupSteps": [
    {
      "name": "기존 Fail2ban 설정과 화이트리스트 백업",
      "kind": "state-verify",
      "role": "ADMIN",
      "application": "admin",
      "description": "대상 테넌트의 기존 정책과 실행 IP 화이트리스트를 백업하고 모든 테스트 종료 후 원복한다.",
      "required": true,
      "mutation": "temporary",
      "guardEnv": "QA_3823_ALLOW_FAIL2BAN_MUTATION",
      "navigation": {
        "name": "부서 설정 관리",
        "path": "/admin/department-setting"
      },
      "restore": {
        "required": true,
        "description": "QA 종료 후 기존 Fail2ban 정책값과 실행 IP의 화이트리스트 등록 사유를 원래 상태로 복구한다."
      }
    },
    {
      "name": "Fail2ban 정책 및 BAN 상태 자동 검증",
      "kind": "state-verify",
      "role": "ADMIN",
      "application": "admin",
      "description": "실제 실패 로그인 요청으로 기간형·반복·영구 BAN과 화이트리스트 범위를 검증한다.",
      "required": true,
      "mutation": "temporary",
      "guardEnv": "QA_3823_ALLOW_FAIL2BAN_MUTATION",
      "navigation": {
        "name": "차단 IP 관리",
        "path": "/admin/ip-block-manage"
      },
      "restore": {
        "required": true,
        "description": "각 테스트 및 전체 종료 시 실행 IP의 활성 BAN을 해제하고 기존 정책과 화이트리스트 상태를 복구한다."
      }
    }
  ],
  "pages": [
    {
      "name": "부서 설정 관리",
      "application": "admin",
      "path": "/admin/department-setting",
      "tenantParam": "tenantId",
      "roles": [
        "ADMIN"
      ],
      "recordsSelector": "body"
    },
    {
      "name": "차단 IP 관리",
      "application": "admin",
      "path": "/admin/ip-block-manage",
      "tenantParam": "tenantId",
      "roles": [
        "ADMIN"
      ],
      "recordsSelector": "body"
    },
    {
      "name": "비스킷링크/비스킷페이 로그인",
      "application": "store",
      "path": "/sign-in",
      "tenantParam": "tenantId",
      "authRequired": false,
      "roles": [
        "BO",
        "CO",
        "VE"
      ],
      "recordsSelector": "body"
    }
  ]
}
