
# 공격 모드 상태 조회

`GET /v1/attack-protection/attack-mode` · 권한 `attack-protection:read`

환경이 공격 모드인지 여부와, 지난 90일 안에 시작되었거나 아직 열려 있는 공격 모드 기간을 최신순으로 반환합니다(최대 100개). `more`는 해당 기간 안에 더 오래된 기간이 있는지를 알려 줍니다.

환경이 공격 모드인 동안에는 `bot_protection.mode` 값과 관계없이 모든 비밀번호 및 일회용 코드 단계에서 더 강력한 봇 검증을 요구합니다. 패스키와 소셜 로그인은 검증 대상이 아닙니다. 기간은 다음 세 가지 방식 중 하나로 열립니다.

- `auto`: 5분 창 안의 로그인 실패 횟수가 트리거 임계값(50과 환경 중앙값의 10배 중 큰 값)을 넘었습니다. `credential_stuffing`의 `log` 모드에서는 기간이 `would_have: true`로 기록되며, 임계값의 3배를 넘지 않는 한 아무것도 적용되지 않습니다.
- `manual_customer`: [`activate`](activate-attack-mode.md)를 사용해 직접 켰습니다.
- `manual_platform`: KeenAuth 운영팀이 켰습니다.

`active`는 적용되는(`would_have: false`) 기간이 환경 전체를 덮고 있는 동안에만 `true`입니다. 이때 `active_until`은 해당 기간들의 가장 늦은 종료 시각입니다. 종료 시각이 지났지만 정리 작업이 아직 닫지 않은 기간은 `ends_at`에 종료된 것으로 표시됩니다. 수동 기간을 누가 열었는지는 이 응답이 아니라 관리 감사 로그에서 확인할 수 있습니다.

## 응답

`200 OK`

| 필드 | 타입 | 설명 |
|---|---|---|
| `active` | boolean | 지금 환경이 공격 모드인지 여부입니다. |
| `active_until` | string (date-time) 또는 null | 자동 기간이 연장되지 않는 한 현재 공격 모드가 끝나는 시각입니다. `active`가 `false`이면 `null`입니다. |
| `periods[]` | array | 기간 목록(최신순)입니다. |
| `periods[].id` | string | 기간 ID이며 `atm_` 접두사가 붙습니다. |
| `periods[].scope` | string | `environment` 또는 `org_domain`입니다. |
| `periods[].org_domain` | string 또는 null | `org_domain` 기간의 조직 이메일 도메인입니다. |
| `periods[].trigger` | string | `auto`, `manual_customer` 또는 `manual_platform`입니다. |
| `periods[].would_have` | boolean | `true`이면 `log` 모드에서 기록만 되고 적용되지 않은 기간입니다. |
| `periods[].trigger_value` | integer 또는 null | `auto` 기간을 연 5분 창 안의 실패 횟수입니다. 수동 기간이면 `null`입니다. |
| `periods[].threshold` | integer 또는 null | 그 창이 넘은 임계값입니다. 수동 기간이면 `null`입니다. |
| `periods[].started_at` | string (date-time) | 기간이 시작된 시각입니다. |
| `periods[].ends_at` | string (date-time) | 기간이 자체적으로 끝나는 시각입니다. `auto` 기간은 공격이 계속되는 동안 연장됩니다. |
| `periods[].ended_at` | string (date-time) 또는 null | 기간이 실제로 끝난 시각입니다. 열려 있는 동안에는 `null`입니다. |
| `more` | boolean | 지난 90일 안에 더 오래된 기간이 있는지 여부입니다. |

```json
{
  "active": true,
  "active_until": "2026-10-20T10:00:00Z",
  "periods": [
    {
      "id": "atm_01jaz8m5c3f6t9w2y4b7d0g3k6",
      "scope": "environment",
      "org_domain": null,
      "trigger": "manual_customer",
      "would_have": false,
      "trigger_value": null,
      "threshold": null,
      "started_at": "2026-10-20T09:00:00Z",
      "ends_at": "2026-10-20T10:00:00Z",
      "ended_at": null
    }
  ],
  "more": false
}
```

## 오류

모든 오류는 안정적인 `code`를 포함한 `application/problem+json` 본문으로 반환됩니다.

| HTTP | `code` | 발생 조건 |
|---|---|---|
| 401 | `unauthenticated` | API 키가 없거나, 잘못되었거나, 폐기되었습니다. |
| 403 | `insufficient_permissions` | 키에 `attack-protection:read` 권한이 없습니다. |
| 429 | `rate_limited` | 속도 제한을 초과했습니다. `Retry-After`를 따르십시오. |
| 503 | `service_unavailable` | 종속 서비스를 일시적으로 사용할 수 없습니다. 나중에 다시 시도하십시오. |

## 예제

```bash
curl https://api.eu.keenauth.com/v1/attack-protection/attack-mode \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

CLI: `keenauth attack-protection attack-mode get`
