---
title: "ADR-0006: Authorize internal access through client-bound endpoint grants"
manual: "HTTP Guard"
version: "main"
permalink: "https://docs.typo3.org/permalink/netresearch/nr-http-guard:adr-0006@main"
source: "Adr/ADR-0006-ClientBoundEndpointGrants.rst"
rendered: "2026-10-18T14:31:38+00:00"
---

# ADR-0006: Authorize internal access through client-bound endpoint grants {#adr-0006}

-   *Status:* Historical proposal (original status: Proposed)
-   *Date:* 2026-10-08
-   *Original decision makers:*

    Project architecture/security owners; approval
    still pending in the original proposal.

-   *Requirements:* HG-012, HG-017, HG-018, HG-019, HG-035, HG-038
-   *Original supersession:* None; a new decision for the proposed product.

> [!NOTE]
> This is the full English translation of the historical proposal dated
> 2026-10-08, originally Proposed. Its pending approval is historical and
> creates no additional alpha approval gate. Current
> [Security model and limits](https://docs.typo3.org/permalink/netresearch/nr-http-guard:security@main), [Development and tests](https://docs.typo3.org/permalink/netresearch/nr-http-guard:development@main), [Verification report](https://docs.typo3.org/permalink/netresearch/nr-http-guard:verification-report@main) and
> [Requirements and security invariants](https://docs.typo3.org/permalink/netresearch/nr-http-guard:development-requirements@main) describe the operative scope and evidence.
>
> The later single-package decision is recorded in [ADR-0015: One installable extension](https://docs.typo3.org/permalink/netresearch/nr-http-guard:adr-0015@main).

## Context {#adr-0006-context}

Internal ERP, search or LLM services are legitimate targets. A global host
permission would also give the user-controlled URL importer the same access.
In the existing factory code, TYPO3 contexts do not provide authorization
automatically propagated to arbitrary middleware. Vault's flat allowlist has
different semantics from Core's context list.

Sources: `[S01, S03-S05]`.

## Decision {#adr-0006-decision}

A profile binds the exact scheme/host/port origin, methods, permitted CIDRs,
purpose, responsibility and expiry. The application receives an already-bound
client through trusted service wiring. A URL alone, or a profile name chosen
by the user, does not activate a grant.

Registry-owned, non-serializable grant objects are bound to the profile and
policy generation. The internal ConnectionPlan cannot be exported as a
persistent send token. A diagnostic permission from `policy-check` is
not a grant.

The Core allowlist, hard/globally configured prohibitions and endpoint profile
apply cumulatively. Operator deny takes precedence. Private networks need
narrow CIDRs; loopback additionally needs an explicit flag and host prefix.
Metadata/link-local and other hard prohibitions have no blanket allow switch.

## Rejected alternatives {#adr-0006-rejected-alternatives}

-   **Global** `allow_private=true`: too broad.
-   **Automatically approve every configured hostname:** does not solve the
    confused-deputy problem.
-   **Treat a string context as a secret:** copyable and provides no reliable
    binding.
-   **Process-wide "current context":** error-prone with parallel requests.

## Consequences {#adr-0006-consequences}

Internal integrations remain possible without elevating public fetch. They
require explicit client injection. Grants are an application architecture
rule, not hard isolation against code execution in the same PHP process.

## Evidence and acceptance in the original proposal {#adr-0006-verification-and-acceptance}

`T021, T034, T035, T036, T037, T038, T039, T068, T073`. Details and
expected results are in [Original verification specification](https://github.com/netresearch/typo3_http_guard/blob/3f929ae8794ca04ab3dd25627e94d601a2db23e0/specification/specs/06-verification.md). These tests
were specified, not executed as part of the original documentation delivery.

## Reasons to reconsider {#adr-0006-reassessment-trigger}

A new class of internal targets or more flexible profile syntax requires a
threat-model update. Wildcards and network-range permissions for every caller
are not incidental convenience features.

## Related documents {#adr-0006-related-documents}

[Original ADR](https://github.com/netresearch/typo3_http_guard/blob/3f929ae8794ca04ab3dd25627e94d601a2db23e0/specification/adr/ADR-0006-clientgebundene-endpoint-grants.md), [Original product requirements](https://github.com/netresearch/typo3_http_guard/blob/3f929ae8794ca04ab3dd25627e94d601a2db23e0/specification/specs/01-product-requirements.md), [Original security model](https://github.com/netresearch/typo3_http_guard/blob/3f929ae8794ca04ab3dd25627e94d601a2db23e0/specification/specs/02-security-model.md),
[Original architecture](https://github.com/netresearch/typo3_http_guard/blob/3f929ae8794ca04ab3dd25627e94d601a2db23e0/specification/specs/03-architecture.md) and [Original source catalogue](https://github.com/netresearch/typo3_http_guard/blob/3f929ae8794ca04ab3dd25627e94d601a2db23e0/specification/specs/08-evidence-and-sources.md) (`S01-S23`),
plus the [ADR index](https://docs.typo3.org/permalink/netresearch/nr-http-guard:adr-index@main). [Original sources](https://docs.typo3.org/permalink/netresearch/nr-http-guard:adr-original-sources@main) explains
the immutable source index.
