Skip to content

Connection security

Trading webhook logs: redact secrets, keep the evidence

Keep request, event and run references useful while excluding authentication material. A fictional retry timeline shows which evidence must survive redaction.

Three ivory cards with black bands are linked by lime cords above a dark surface.
Illustration for connection security; examples in this article are educational.

Redact trading webhook logs by recording an allowlisted event summary instead of request bodies, authentication headers or signing material. Keep safe correlation identifiers, verification outcomes, timestamps and failure reasons so an operator can reconstruct what happened. Apply the policy before data enters diagnostic pipelines, and test that rejected requests stay secret-free too.

Decide what the record must explain

A useful webhook log answers a small set of operational questions. Did the receiver see a request? Did authentication pass? Was the signal admitted, rejected or recognized as an existing event? Did a workflow start? What is known about any order submission?

Those questions rarely require a copy of the incoming request. A full request dump can spread a secret into an application log, exception tracker, tracing service and support export at once. Removing it from the screen later leaves the earlier copies unresolved.

OWASP's logging guidance recommends useful event attributes such as interaction identifiers, times, results and reasons, while identifying access tokens, authentication passwords and primary secrets as data generally unsuitable for direct log storage. Use that separation to design the event before choosing a redaction filter.

Write a field allowlist: an explicit inventory of what the diagnostic record may contain. Begin with empty output and add approved fields. A list of forbidden field names can supplement this policy, but a new nested field or a renamed credential must not automatically become loggable.

Keep signing secrets, exchange API credentials, authorization values, cookies and credential-bearing URLs out of ordinary diagnostics. Treat signature values as excluded authentication material too. A signature is different from its signing secret, but preserving a signed request can increase replay exposure where other controls are absent.

Verify the request without logging its contents

The verifier and the logger have different jobs. Verification may need the exact original payload bytes in memory. The logger needs the outcome of that verification. Redact the diagnostic copy; do not alter signed bytes before the verifier checks them.

For a concrete provider example, GitHub's webhook validation documentation describes a signature derived from the secret and payload, delivered in its X-Hub-Signature-256 header. Its verification instructions are specific to GitHub. They do not establish which headers another sender supplies or which fields another protocol authenticates.

Record a bounded reason such as signature_missing or signature_invalid, rather than printing the supplied value and the expected value for comparison. Avoid attaching a whole request object to the exception. Diagnostic convenience should not determine which authentication material becomes durable.

For unauthenticated arrivals, generate a receiver request reference and retain the rejection outcome. Do not promote a claimed account, workflow or event ID from the incoming body into trusted context. Even after successful verification, establish which identity fields the actual protocol covers. The separate webhook replay protection guide explains that admission boundary.

An example of a useful structured event

The following is an original, hypothetical event schema for a simulation harness. These are invented non-authorizing references, not real account identifiers. The exercise assumes its protocol authenticates the event ID and its receiver maps the endpoint to configured scope.

Each row represents one field in a structured log record. The table is a design worksheet, not a record produced by a deployed service.

FieldExample valuePurpose
schema_version2Identify the event contract
received_at2026-10-27T12:00:00.000ZRecord receiver arrival time
environmentsimulationKeep test evidence distinguishable
endpoint_refrelay-test-02Use a configured alias, without a URL
request_refreq-AIdentify this receiver request
event_refsignal-41Join authenticated event history
verificationpassedPreserve the security decision
admissionacceptedDescribe the admission decision
reason_codestoredExplain the result consistently
run_refrun-9Link subsequent workflow events
redaction_policywebhook-safe-v3Identify the applied logging policy

The record contains neither a request body nor an authentication value. It can still connect a received signal to its admission and run. Later state changes produce additional records with the same appropriate references, rather than rewriting the first result.

Use separate references for separate identities. A request reference identifies an arrival at the receiver. An event reference identifies the underlying signal within its authenticated scope. A run reference identifies processing. An order reference identifies an execution attempt or venue order, according to its documented meaning. One label called “ID” leaves too much room for mistaken joins.

These references still belong in protected diagnostics. An identifier that grants no authority can reveal activity or link a person to trading behavior. For a support copy, replace internal references with consistent case aliases when the recipient does not need the originals.

Follow a retry through an unresolved submission

Consider this fictional timeline in the simulation harness. It assumes the receiver durably stores one accepted event, the worker makes one simulated submission and the response is lost. Times describe the example's expected sequence, not measured performance or a retry policy supplied by any provider.

UTC timeSafe event evidenceWhat remains known
12:00:00.000req-A received; candidate event identity withheldArrival recorded; admission pending
12:00:00.008Verification passes; signal-41 stored; run-9 createdOne durable admission
12:00:00.050run-9 records simulated submission attemptOne attempt; venue outcome pending
12:00:02.050Submission response times outOutcome unresolved
12:00:05.000req-B receives the same authenticated eventExisting admission found; no new run
12:00:08.250Reconciliation finds the simulated orderExisting order linked to run-9

Admission takes 8 milliseconds from arrival. The response timeout is 2,000 milliseconds after the submission attempt, rather than after initial receipt. The duplicate arrives 5,000 milliseconds after the first request. Resolution occurs 8,250 milliseconds after receipt, including 6,200 milliseconds during which the submission outcome was unresolved.

Two requests therefore correspond to one accepted event, one run and one submission attempt in this fixture. The duplicate contributes evidence without authorizing another run. A redaction policy that removes every reference would make this relationship difficult to reconstruct. A policy that copies every request would collect unnecessary authentication material.

Logs describe what components reported; confirm important transitions against durable admission records and venue evidence. A successful webhook response does not establish a fill, and a submission timeout does not establish rejection. Preserve unresolved until the order reconciliation process establishes what happened.

Check every place a diagnostic copy can appear

Application logging is only one copy point. Inspect reverse-proxy access logs, runtime exceptions, tracing instrumentation, failed-message diagnostics, alert messages and support exports. A clean application event cannot undo an earlier raw capture upstream.

OpenTelemetry's sensitive-data guidance emphasizes collecting only attributes that serve an observability purpose and reviewing what instrumentation libraries emit. It documents Collector processors that can remove attributes, including an allowlist-based redaction processor. Such processors provide an additional control; their existence does not show that a deployment enabled them or that an earlier sink is clean.

Use synthetic, unmistakable markers in an isolated test environment. They must carry no real authentication authority. Look for their original and expected encoded forms in each resulting diagnostic destination. The exercise tests known paths without deliberately exposing a live key; passing it cannot establish that every future payload or instrumentation change will remain safe.

Test caseExpected useful evidenceRedaction failure to look for
Missing or invalid signatureReceiver request reference and bounded rejection reasonAuthentication values in exception details
Nested or renamed sensitive fieldApproved summary fields onlyA new body field bypasses a name-based filter
Malformed bodyParse-failure category and safe size informationParser logs a body fragment
URL containing a synthetic credential markerEndpoint alias and request referenceRaw path or query in proxy and trace records
Worker or simulated venue errorRun reference, operation category and unresolved stateSDK exception includes headers or configuration
Support exportCase aliases and necessary state historyExport restores fields hidden in the normal viewer

Also test control characters and unusually long values. Keep reason codes bounded, enforce field lengths and encode output correctly so untrusted input cannot create misleading extra log entries. OWASP addresses these log collection safeguards.

Run the worksheet against a small controlled deployment before expanding collection. The canary rollout guide provides a way to define evidence and stopping conditions for that limited change. Record which sinks were inspected and which remain inaccessible; a partial inspection should remain visibly partial.

Keep the evidence small and interpretable

Avoid hashing a secret just to create an identifier. Prefer a separate, non-authorizing credential inventory alias when identifying a configured signer is necessary. A digest of a body is also a design choice, not automatic anonymization: it can reveal repeated content and may permit guessing when the possible inputs are predictable. OpenTelemetry explicitly discusses the limitations of hashing predictable identifiers.

Define an owner, access scope, retention period and disposal process for each diagnostic destination. Choose the period from the actual incident, retry and reconciliation requirements rather than copying an arbitrary duration. Account for exports and backups when documenting how long copies persist. Redaction reduces what is collected; it does not remove the need to control the remaining record.

For a support packet, retain the environment, bounded incident window, case references, relevant state transitions and unresolved questions. Leave account balances, full payloads and authentication material out unless a separate authorized process establishes a specific need. If a live credential entered logs, follow the credential incident response procedure; changing the logging policy alone does not end that credential's authority.

An explanation generated from the record should preserve its limits. “The worker reported a timeout” supports an unresolved submission, not a claim that no order existed. The explanation faithfulness guide examines that connection between evidence and narrative.

Before approving a logging change, reconstruct one rejected delivery and one accepted event with a retry using only the permitted fields. If the sequence is understandable and synthetic secret markers are absent from every inspected sink, save that evidence with the policy version and the remaining inspection gaps.

Keep the context with the example.

Each worked example is illustrative, with its sources and assumptions in the article. Read our editorial standards for authorship, verification and corrections.