System designLoading progress…

Auditing and abuse handling

Place authentication, object authorization and resource limits at explicit application boundaries.

Auditing and abuse handling

Record who did what to which resource and with what outcome: identity, action, resource, outcome. Never record credentials that can be replayed. Plan how you will revoke access (a revoked token must fail at once, 401) and how you will investigate, both for honest mistakes and for deliberate abuse: filter the trail by identity or by resource.

audit record: { identity: "alice", action: "export", resource: "report:7", outcome: "ok" } 4 fields: who, what, on what, what happened: no reusable credential request with alice's token: 200 investigation: filter events by identity or resource; plan revocation for mistakes and for abuse
Toggle revocation and secret logging.

Predict first. Should an audit log contain raw reusable API secrets?

Chapter context

A distributed application must identify callers and control which resources and effects they may access. Tenant boundaries and resource budgets must be enforced by trusted components rather than inferred from client-supplied identifiers.

Chapter reference: math, worked example & code

This section belongs to the whole chapter, so it is the same on every lesson in it and may cover a different lesson's topic. The code for the experiment you just ran is inside the experiment itself.

Math and notation

For a token bucket with capacity C, refill rate r, previous tokens b and elapsed time dt:

b′=min⁡(C,b+r dt).b'=\min(C,b+r\,dt).

Accept cost k only when b′≥kb'\ge k, then subtract k atomically. Clock behavior, concurrency and shared enforcement are additional implementation requirements.

Worked example

A bucket holds at most 10 tokens and refills 2/s. An 8-token request at time zero leaves 2. Two seconds later it has 6. A request costing 7 is denied and leaves 6; a request costing 6 is accepted and leaves zero. Rejected operations should not accidentally create negative credit under this contract.

Reference code

The following example uses the Python standard library and does not call a remote service.

capacity,rate,tokens=10,2,10
tokens-=8
assert tokens == 2
tokens=min(capacity,tokens+rate*2)
assert tokens == 6
assert tokens < 7
assert tokens >= 6
tokens-=6
assert tokens == 0

Python examples are provided for study and local execution; this page does not execute Python.

Common mistakes

Authentication is not object-level authorization. Cache and worker paths can cross tenant boundaries too. A global rate limit requires a stated distributed enforcement contract.