Web Security
Webhook Security for Agentic Workflows
A practical defensive guide to authenticating webhooks and safely triggering AI workflows, tools, jobs, and side effects.
A webhook is external event input, not a command that bypasses authorization. A valid signature can prove that a provider sent bytes, but it does not prove that every downstream action is allowed. For an AI workflow, preserve that distinction through the entire path from endpoint to agent to side effect.
Webhook-to-agent trust pipeline
WEBHOOK SENDER → TLS ENDPOINT → RAW REQUEST CAPTURE → SIGNATURE VERIFICATION → FRESHNESS / REPLAY CHECK → PARSE → IDEMPOTENCY → TENANT AND RESOURCE RESOLUTION → POLICY → QUEUE → AGENT → TOOL GATEWAY → SIDE EFFECT
The endpoint should acknowledge only after authenticity and basic validity checks, then hand durable work to a queue when processing is longer than the provider’s timeout. Every hop carries an opaque event ID, constrained job identity, and server-derived tenant context.
Transport and authenticity
Use HTTPS and validate certificates normally, but remember that encryption does not identify the sender by itself. Follow the provider’s documented signing algorithm. Common designs include HMAC with a shared secret, asymmetric signatures, or a provider-specific signed request. Verify the exact raw request bytes when the provider signs them; parsing JSON, changing whitespace, or normalizing headers before verification can change the signed message.
Keep signing secrets in trusted server-side storage. Never put them in prompts, browser code, event bodies, or ordinary logs. Rotate keys using the provider’s supported overlap process so old and new signatures can be verified for a bounded transition.
Freshness and replay resistance
An attacker who obtains a previously valid event may replay it. If signed timestamps are supported, reject events outside a documented clock-skew window. Use a provider event ID or nonce in a durable replay cache with an expiration that exceeds the retry window. A timestamp check alone does not deduplicate two valid deliveries inside the window.
Idempotency and ordering
Providers retry when acknowledgements are delayed, and networks can duplicate requests. Store an idempotency record before starting irreversible work, with a uniqueness constraint on provider and event ID. Retries should return the existing outcome or safely resume it. Do not rely on an LLM to decide whether it has already processed an event.
Events can arrive late or out of order. Use provider sequence information where available, or design state transitions to reject stale versions and tolerate reordering. A duplicate payment, email, deletion, or agent run is a business failure even when transport authentication succeeded.
Resolve tenant and resource server-side
Never trust tenant, account, invoice, or document references from an event without checking ownership in your database. Resolve the resource using the authenticated integration identity and current membership, then apply the same authorization policy used by interactive requests. A signed event from a partner can still be unauthorized to modify a particular tenant resource.
Authenticity is not authorization
| Question | Control |
|---|---|
| Who sent it? | Signature and endpoint authenticity |
| Is it fresh? | Timestamp and replay controls |
| Did we process it? | Durable idempotency |
| Which tenant/resource? | Server-side resolution and ownership check |
| May this action happen? | Policy authorization |
| Can an agent execute it? | Tool and capability policy |
A signature answers the first question only. The policy decision must include principal, tenant, action, resource, and context.
Queue and agent boundary
After verification, enqueue a small, immutable job containing event ID, provider, and an opaque resource reference. Keep raw bodies in controlled storage when needed for audit, with access restrictions and retention limits. Configure retries, visibility timeouts, dead-letter handling, and poison-job quarantine without assuming a particular broker.
When an event enters an agent, label its fields as untrusted data. Webhook text must not become privileged instructions merely because it passed signature verification. An agent may summarize or propose work, but trusted application code still validates tool arguments and authorization. See indirect prompt injection guidance and secure tool calling.
Downstream tools and side effects
Route proposals through a tool gateway that validates schemas, resolves identity, checks resource ownership, applies risk policy, and obtains scoped credentials. High-impact actions may require human approval. Do not forward the webhook provider’s secret, cookies, or broad administrative token to a model-selected destination. A valid incoming event never grants unlimited authority to an agent.
Failure, rate, and lifecycle controls
Separate invalid signature, stale event, permanent business rejection, and temporary processing failure. Return minimal error details to the sender and log the reason internally. Apply provider-specific and global rate limits, queue budgets, maximum event size, and per-job execution limits. Old endpoints and secrets should be revocable; disable integrations when a tenant disconnects or an incident requires containment.
Webhook control matrix
| Stage | Threat | Control | Persistent evidence | Retry behavior |
|---|---|---|---|---|
| Receive | spoofing or body tampering | TLS, raw capture, signature verification | provider, signature result, hash | reject; no retry |
| Freshness | replay | timestamp window and replay cache | event ID, clock decision | reject duplicate |
| Parse | malformed input | schema and size validation | parser result | dead-letter invalid |
| Resolve | cross-tenant reference | server-side ownership lookup | tenant, resource, policy | permanent reject |
| Queue | duplicate or loss | durable idempotency and job ID | enqueue/ack records | safe retry |
| Agent | injected event text | untrusted-data boundary and constrained prompt | model/task ID | retry only bounded |
| Tool | unauthorized side effect | gateway authorization and approval | decision, credential scope | do not replay blindly |
| Complete | ambiguous outcome | idempotent state transition | result and audit link | reconcile manually |
Observability and incident response
Record provider, event ID, received timestamp, signature result, normalized resource, tenant, dedupe result, job ID, policy decision, tool calls, and outcome. Avoid logging signing secrets or full sensitive bodies. Keep clock synchronization and correlation IDs consistent across endpoint, queue, agent, and API.
During an incident answer: which provider event triggered the run, which agent and job processed it, what policy allowed the action, what destination changed, and whether retries occurred. Revoke the endpoint or key, block queued jobs, invalidate replay entries as appropriate, and reconcile external state.
Testing checklist
Test valid events, invalid signatures, altered raw bodies, stale timestamps, duplicate IDs, out-of-order delivery, unknown tenants, unauthorized resources, queue retries, dead letters, key rotation, oversized bodies, agent prompt injection, and duplicate side effects. Verify that every rejection leaves evidence and that a retry cannot create a second irreversible action.
Sources
Use OWASP guidance, provider documentation such as Stripe webhook signatures and GitHub webhook validation, and applicable IETF HTTP Message Signatures. PermsAI’s pipeline and matrices are an architectural synthesis.
Boundary conditions for integrations
Treat each provider integration as a separate trust relationship. Store the provider account or installation identifier with the tenant mapping, and reject events that claim an unexpected account. Do not infer ownership from display names. If a provider can send several event versions, validate the version explicitly and keep a compatibility policy rather than silently accepting unknown fields.
For long-running jobs, re-check authorization at execution time. A tenant may disconnect an integration after the webhook was accepted, or a user’s role may change while the job is waiting. Queue payloads should therefore carry references, not permanent bearer authority. Workers fetch current policy and obtain a short-lived scoped credential immediately before the downstream call.
A safe acknowledgement strategy is part of reliability: acknowledge authenticated, well-formed events once durable deduplication is recorded; retry transient internal failures without asking the provider to resend an already completed side effect. This keeps transport behavior predictable while preserving an auditable chain from event to outcome.