API Security Across 10+ Interconnected Systems: Auth Boundaries, Service-to-Service Trust, and Data Flow Controls
What changes about API security when you have a dozen systems instead of one, and how to keep the blast radius small.
2026-08-05 · By Filip Lauc
Why multi-system estates break the standard API security playbook
The standard playbook assumes one API with one class of client. A ten-system estate has many APIs, many client types, and a large internal surface where services call each other with implicit trust. The dangerous vulnerabilities live in those internal paths, not at the public edge everyone hardens first.
Consider a realistic health testing platform: a customer portal, a mobile app, a laboratory information system, a warehouse and fulfilment tool, a partner clinic dashboard, an admin back office, a BI pipeline, a marketing automation integration, a payment provider, and a shipping carrier. A single test result travels through most of them. The customer portal is behind a login. The lab system is on a private network. The BI pipeline reads from a replica. Each looks reasonable in isolation, and yet the result record exists in five places with five different access models.
The failure mode is not usually a broken cipher or a missing rate limit. It is an internal endpoint written under the assumption that only trusted callers reach it, then exposed later through a new integration. Or an admin API that accepts a user ID as a parameter and returns whatever it finds, because the original caller was already trusted. OWASP calls this broken object level authorization, and in interconnected estates it multiplies with every new consumer you add.
Draw explicit auth boundaries, one per trust zone
An auth boundary is a line where identity is re-established and authorization is re-evaluated rather than inherited. Draw one at every point where the caller class changes: end user to backend, backend to backend, human operator to admin API, and analytics consumer to data store. Each boundary gets its own credential type, its own token lifetime, and its own permission model.
In practice this means refusing to let one token type cross zones. An end-user JWT from the customer portal should never be forwarded verbatim to the lab system. Instead, the API that receives it validates the token, resolves what that user is allowed to see, and then makes a separate authenticated call with its own service credential, carrying only the specific identifiers required. This costs a small amount of code and removes an entire class of confused deputy problems, where an internal service acts on behalf of a caller it never actually authorized.
Partner dashboards deserve their own zone entirely. A partner clinic, retailer, or reseller is neither an end user nor an employee. They need scoped access to a subset of records defined by a relationship, not by a role name. Modelling that relationship explicitly in the data layer, as a partner-to-record link that every query filters on, is more reliable than a permission flag checked in application code that someone will eventually forget to add.
- • Public edge: end users, short-lived access tokens, refresh rotation, per-user rate limits
- • Partner zone: scoped API keys or OAuth clients, relationship-filtered queries, separate quotas and logging
- • Admin zone: SSO with mandatory MFA, step-up auth for destructive actions, full audit trail on every write
- • Service zone: machine identities with narrow scopes, mutual TLS or signed tokens, no shared master credentials
- • Analytics zone: read-only, pseudonymized where possible, no path back into transactional systems
Establish service-to-service trust without a shared master key
Service-to-service trust should be based on per-service identities with narrow, verifiable scopes, not a shared secret pasted into every environment file. The practical options are mutual TLS, signed short-lived tokens issued by an internal authority, or the workload identity primitives your cloud already provides. All three give you a per-caller identity you can revoke independently.
The shared-key pattern fails predictably. When one key authenticates every internal call, rotating it means coordinating a deploy across a dozen services, so nobody rotates it. When a contractor leaves or a log accidentally captures a header, the blast radius is the entire estate. Per-service credentials with scopes turn that into a contained incident: revoke one identity, redeploy one service.
Scope granularity matters more than credential format. The warehouse service needs to read order line items and write fulfilment status. It does not need to read test results, customer payment methods, or user email addresses. Writing those scopes down as part of the API contract, and enforcing them at the receiving service rather than only at a gateway, means a compromised warehouse credential yields warehouse-shaped data and nothing more. Enforcing only at the gateway leaves you exposed the moment someone adds a direct internal route that bypasses it.
Control data flow, not just data access
Access control answers who may call an endpoint. Flow control answers which fields may leave a system, in which direction, and for how long they may be retained downstream. In interconnected estates the second question causes more compliance damage, because sensitive fields propagate quietly into systems that were never designed to hold them.
The concrete mechanism is field-level contracts on every outbound integration. Define, per consumer, exactly which fields the response contains, and make the serializer allow-list based rather than deny-list based. An allow-list means adding a new column to a database table never silently exposes it to a BI pipeline or a partner dashboard. A deny-list means every schema change is a potential leak waiting for someone to remember the exclusion.
Apply the same thinking to derived systems. A BI dashboard rarely needs raw identifiers; it needs cohorts, counts, and timestamps. Marketing automation needs an email address and a lifecycle stage, not clinical data. Support tooling needs enough to identify an account and usually nothing else. Pseudonymizing at the boundary, where the exporting service replaces direct identifiers with stable surrogate keys, keeps analytics useful while ensuring a breach of the analytics layer does not become a breach of personal data. Retention rules then have somewhere to attach: each downstream copy declares how long it keeps what it received, and a scheduled job enforces it.
Make cross-system activity observable and vulnerability management routine
You cannot secure what you cannot see. Every cross-boundary call should emit a structured log line with caller identity, target resource, decision outcome, and a correlation ID that follows the request across systems. Without correlation, investigating an incident in a ten-system estate means manually stitching timestamps across ten log stores.
Audit logging deserves separation from application logging. Application logs get rotated aggressively and are often accessible to anyone with production access. Audit records for sensitive reads and writes, who viewed which test result, who changed which payout, who exported which dataset, should be append-only, retained on a compliance-driven schedule, and readable by a narrower group. Regulators and enterprise customers ask for this specifically, and retrofitting it after the fact is expensive.
Vulnerability management across many repositories needs to be mechanical rather than heroic. Automated dependency scanning on every repository, a policy for how fast critical advisories get patched, and a periodic inventory of which services expose which endpoints publicly. That inventory is the item most teams skip, and it is the one that catches the internal admin API that quietly became reachable from the internet when a load balancer rule changed eighteen months ago.
- • Propagate a correlation ID through every internal call and log it at each hop
- • Log authorization denials, not only successes; denial spikes are early attack signal
- • Keep audit records append-only, with retention driven by your regulatory obligations
- • Scan dependencies per repository and define patch SLAs by severity
- • Re-inventory public endpoints on a schedule, and diff it against what you expect
A pragmatic sequence for hardening an estate you already run
Start with an inventory, then close the highest-leverage gaps in order: public exposure, shared credentials, object-level authorization, then field-level exposure. Trying to redesign the whole auth model at once stalls; sequencing lets each step ship independently while measurably reducing blast radius.
Most teams inherit these estates rather than design them, and each system was reasonable when it was built. The work is not a rewrite. It is a series of contained changes: replacing one shared key with per-service identities, adding an allow-list serializer to one integration, wiring correlation IDs through the request path. Each is a normal sprint-sized task, and together they change the security posture substantially.
This is the kind of work we do continuously on long-running engagements, where the same team maintains a dozen systems over years and can make these changes without breaking the integrations that depend on them. Long tenure helps here for an unglamorous reason: you remember why the odd internal route exists, and whether anything still calls it.
- • Inventory every service, its public endpoints, its data classes, and its callers
- • Eliminate shared credentials; issue per-service identities with explicit scopes
- • Audit object-level authorization on every endpoint that accepts an identifier
- • Convert outbound serializers to allow-lists and pseudonymize at analytics boundaries
- • Add correlation IDs and append-only audit logging for sensitive reads and writes
- • Automate dependency scanning and schedule recurring public-surface reviews
Key Takeaways
- • In multi-system estates the risk concentrates on internal service-to-service paths, not the public edge most teams harden first
- • Re-establish identity at every trust boundary instead of forwarding end-user tokens into backend systems
- • Replace shared internal keys with per-service identities and narrow scopes so a compromise stays contained
- • Use allow-list serializers and boundary pseudonymization so new database fields never leak into BI or partner systems by default
- • Correlation IDs plus append-only audit logs are what make cross-system incidents investigable at all
These patterns come from running estates like this in production; see the GlycanAge case study, where we built and maintained 10+ interconnected systems over a six-year engagement in a regulated health testing environment.
Frequently Asked Questions
Do I need an API gateway to secure a multi-system architecture?
A gateway helps with centralized rate limiting, TLS termination, and edge authentication, but it is not sufficient on its own. Gateways only protect traffic that actually routes through them, and internal service-to-service calls frequently bypass them. Enforce authorization at the receiving service as well, so a direct internal route never becomes an unauthenticated path.
How do I secure APIs consumed by partners who cannot implement OAuth?
Issue scoped, per-partner API keys with the same rigour you would apply to OAuth clients: unique per partner, revocable independently, rate-limited separately, and tied to a relationship filter in the data layer so the key can only ever return that partner's records. Add IP allow-listing where the partner has stable egress, and rotate on a defined schedule with an overlap window so rotation does not cause an outage.
What is the difference between authentication and authorization failures in API security?
Authentication failures mean an attacker gets in as someone they are not. Authorization failures mean a legitimately authenticated caller accesses data they should not see, usually by changing an identifier in a request. In interconnected systems authorization failures are far more common, because internal endpoints are often written assuming the caller has already been vetted upstream.
How often should service credentials and API keys be rotated?
Machine-to-machine tokens should be short-lived by design, ideally minutes to hours, issued automatically by your identity provider or cloud workload identity system. Long-lived partner API keys should rotate at least annually, and immediately on any suspicion of exposure. The real test is not the interval but whether you can rotate a single credential without coordinating a deploy across every service.
Does GDPR affect how data flows between internal systems?
Yes. Data minimization and purpose limitation apply to internal transfers, not just external ones, so copying full customer records into a BI warehouse or support tool because it was convenient is hard to justify. Each downstream system should receive only the fields it needs for a documented purpose, with its own retention period, and you need records showing which systems hold which categories of personal data.
Sources
Written by
Filip Lauc
CEO, Jaspero
Filip Lauc is the CEO of Jaspero, a software development agency based in Osijek, Croatia. A full-stack JavaScript developer with over a decade of experience across Angular, Svelte, and Node.js, he leads Jaspero's work as a long-term embedded engineering partner for clients like GlycanAge, where his team has served as the dedicated engineering team for six years.
Let's Build Together
Your vision,
our expertise.
From AI integration to full-stack development, we turn ambitious ideas into products that perform.