API Security, Authentication and Authorization Questions
Controlling who can call an API, what they may do, and defending it against abuse. Covers the access-control mechanics: API keys, OAuth 2.0 flows, OpenID Connect, JWT issuance/validation, session vs. token auth, scopes/roles for fine-grained authorization, token lifetime and refresh, mutual TLS, and machine-to-machine vs. user-delegated access. Also covers the adversarial hardening view: input validation, injection and deserialization risks, broken object-level authorization (BOLA), mass assignment, secrets handling, and the OWASP API Security Top 10, plus securing data in transit, preventing enumeration/scraping, and testing APIs for vulnerabilities.
Walk me through mutual TLS (mTLS): how does the handshake differ from standard one-way TLS, how do the client and server present and verify each other's certificates, and what are the practical options for certificate provisioning and rotation for service-to-service authentication in a microservice or service-mesh deployment?
Sample Answer
Direct answer
Mutual TLS (mTLS, where "TLS" is Transport Layer Security, the protocol that encrypts and
authenticates network connections) extends standard one-way TLS by having the client also
present a certificate that the server verifies, so both sides cryptographically prove their
identity to each other before any application data flows. In standard one-way TLS only the
server proves who it is; the client stays anonymous at the transport layer and any identity
checking happens later, in the application (a password, a bearer token).
Structured elaboration
How the handshake differs from one-way TLS. In a plain TLS handshake, the server sends its
certificate and the client verifies it against a trusted certificate authority (CA); the client
never presents one of its own. In an mTLS handshake, the server additionally sends a
CertificateRequest message, the client responds with its own certificate plus a
CertificateVerify message (a signature over the handshake transcript, proving the client
actually holds the private key matching that certificate, not just a copy of the public
certificate), and the server verifies the client's certificate against its own trusted CA
(commonly a private, internal CA for service-to-service traffic rather than a public one) before
completing the handshake. If either side's certificate fails verification, the connection is
refused before any request or response is exchanged.
What each side verifies. The client checks the server's certificate chain up to a trusted
root, the certificate's validity window, and that the certificate's subject matches the hostname
being connected to (the checks that already happen in ordinary HTTPS). The server does the
mirror image for the client: chain validity, expiry, and (this is the part unique to mTLS as an
authentication mechanism) that the certificate's identity (its Subject or a SPIFFE-style URI in
the Subject Alternative Name) matches an identity the server is willing to trust, and that the
certificate has not been revoked.
Provisioning and rotation options for service-to-service auth:
- Long-lived certificates issued manually or by a slow internal PKI (public key
infrastructure, the systems and processes for issuing and managing certificates), rotated
every 6 to 12 months. Simple to reason about but a compromised private key stays valid for a
long time, and rotation is often a manual, error-prone, outage-risking event precisely because
it happens rarely. - Short-lived certificates (hours, not months) issued automatically by an internal CA and
rotated continuously, often via a sidecar proxy that handles issuance and rotation
transparently to the application. This is the pattern service meshes like Istio or Linkerd
use, frequently paired with SPIFFE (Secure Production Identity Framework For Everyone, a
standard for representing workload identity as a URI) so identity is tied to what a workload
is (its service account, its namespace) rather than to a long-lived secret. Short TTLs shrink
the blast radius of a leaked key dramatically, since the certificate expires on its own within
hours even if revocation never fires. - A managed cloud CA or secrets-manager-backed issuance for teams that do not want to
operate their own internal CA, trading some control for less operational burden.
Worked example
sequenceDiagram
participant C as Client
participant S as Server
C->>S: ClientHello
S->>C: ServerHello plus Server Certificate
S->>C: CertificateRequest
C->>S: Client Certificate
C->>S: CertificateVerify (signed with client private key)
S->>S: Verify client cert against trusted CA, check chain and revocation
C->>S: Finished
S->>C: Finished
Note over C,S: Both sides now hold a mutually authenticated encrypted channel
The two extra round-trip messages compared to one-way TLS are CertificateRequest (the server
asking) and the client's Client Certificate plus CertificateVerify pair (the client proving
it holds the matching private key, not merely presenting a public certificate it copied from
somewhere). Everything after Finished on both sides is identical to ordinary TLS: an encrypted
channel, just one where the server now also knows, cryptographically, which specific
service-identity it is talking to, without needing an application-layer credential to establish
that.
Trade-offs and pitfalls
- mTLS proves connection identity, not user identity. It tells a server which service or
workload is calling, which is exactly the right primitive for service-to-service traffic in
a microservice or service-mesh deployment; it is the wrong tool for authenticating an
individual end user, since a human does not carry a private key the way a workload's sidecar
does. OAuth 2.0 or session-based authentication remains the right layer for user identity, and
the two are often combined (mTLS between services, a user token passed through inside that
channel). - Short-lived automated certificates need working automation, not just working crypto. If
the sidecar or agent responsible for rotation fails silently, certificates expire and every
connection using them starts failing at once, an outage that a slower manual rotation schedule
is less exposed to (at the cost of a much larger blast radius if a key leaks). Automated
rotation needs its own monitoring and alerting on issuance failures, not just on the
certificates' expiry dates. - Common wrong turn: skipping revocation checking because "the certificates are short-lived
anyway." Short TTLs reduce how long a compromise matters, but do not eliminate the window
entirely; a certificate stolen minutes before use is still valid until it expires, so
revocation checking (or, more commonly in practice, simply re-issuing all workload identities
and rotating the internal CA's trust) still matters for a confirmed compromise. - Common wrong turn: terminating mTLS at a load balancer and trusting an internal header for
identity afterward. If the load balancer is not itself inside the trust boundary you are
defending, or if an internal service can be reached directly without going through it, an
attacker who reaches the internal network can forge the identity header the same way they
would forge any other unauthenticated claim.
Define rate limiting, throttling, and quotas in the context of APIs. Describe the token-bucket, leaky-bucket and fixed-window algorithms, and explain practical strategies for per-user, per-IP, per-client and global limits, as well as handling bursty traffic and fairness.
Sample Answer
Direct answer
Rate limiting caps how many requests a caller can make in a given window; throttling is the
mechanism that enforces that cap by delaying or rejecting requests once it is reached; a quota is
a longer-horizon budget (often daily or monthly) layered on top, separate from a short-window
rate limit. The three classic algorithms, token bucket, leaky bucket, and fixed window, differ
mainly in how they treat bursts of traffic that arrive faster than the sustained allowed rate,
which matters because most real traffic is not smooth, it is bursty.
Structured elaboration
Fixed window. Count requests in discrete, non-overlapping time windows (for example, one
counter that resets every 60 seconds) and reject once the count exceeds the limit. It is the
simplest to implement and reason about, but has a well-known boundary flaw: a client can send a
full window's worth of requests right at the end of one window and another full window's worth
immediately at the start of the next, doubling the effective burst right at the boundary (worked
out below).
Token bucket. A bucket holds up to burst tokens and refills continuously at
tokens_per_sec; each request consumes one token, and a request is rejected only once the
bucket is empty. This naturally allows a burst up to the bucket's capacity while still enforcing
a long-run average rate equal to the refill rate, which is usually the closest match to how real
clients behave (idle, then a burst of activity).
Leaky bucket. Modeled as a fixed-size queue that is filled by incoming requests and drained
(processed) at a constant rate; if the queue is full, new requests are rejected. Where token
bucket allows a burst to pass through immediately (up to the bucket size), leaky bucket smooths
a burst out into a steady output rate, at the cost of adding queuing delay to the requests that
arrive during the burst.
Per-user, per-IP, per-client, and global limits. These are not alternatives to each other,
they are usually layered: a global limit protects the backend from aggregate overload regardless
of source; a per-client (per API key) limit is the primary fairness mechanism between distinct
customers; a per-user limit protects against one compromised or misbehaving account inside a
larger client; a per-IP limit adds a cheap first line of defense against anonymous or
unauthenticated abuse, understanding that many real users can share one IP (a corporate NAT), so
per-IP limits alone are a blunt fairness tool.
Bursty traffic and fairness. Token bucket's burst parameter is the direct knob for how much
burst capacity to tolerate before the sustained rate kicks in; setting it too low makes normal,
slightly bursty legitimate usage feel throttled, and setting it too high defeats the point of
having a sustained rate limit at all. Fairness across many keys typically means giving each key
its own independent bucket or counter (as in the earlier rate-limiter implementation on this
topic) rather than one shared counter that lets one noisy client starve everyone else's share of
capacity.
Worked example
Fixed window's boundary flaw, with real numbers. Limit: 100 requests per 60-second window.
Window 1 spans [0:00, 1:00); window 2 spans [1:00, 2:00). A client sends 100 requests at 0:59.5
(all counted in window 1, at the limit) and another 100 requests at 1:00.5 (all counted in
window 2, also at the limit). Both windows individually respect the 100-per-minute cap, yet 200
requests passed within the single one-second span from 0:59.5 to 1:00.5, double the intended
rate concentrated right at the boundary.
Token bucket, with real numbers. burst = 20, tokens_per_sec = 5. A client that has been
idle can immediately send 20 requests back to back (draining the bucket), matching the intended
burst tolerance. After the bucket is empty, tokens refill one every 1 / 5 = 0.2 seconds, so a
sustained caller settles into exactly 5 requests/second, matching the configured rate, with no
further burst until idle time lets the bucket refill.
Leaky bucket, with real numbers. Queue capacity 20, drain rate 5 requests/second. If 20
requests arrive simultaneously, the queue fills completely and the 20th request is not rejected,
but it is not processed immediately either: it is dequeued and processed 20 / 5 = 4 seconds
after it arrived, since the queue drains at a fixed rate regardless of how the requests arrived.
This is the direct trade-off against token bucket: leaky bucket accepted all 20 (no immediate
rejections) but imposed queuing delay, where token bucket would have accepted the same 20
immediately (assuming burst >= 20) with no delay at all, at the cost of allowing that
instantaneous spike to actually reach the backend.
Trade-offs and pitfalls
- Fixed window is cheap but boundary-exploitable, as shown above; if you need fixed window's
simplicity without the boundary flaw, a sliding-window variant (weighting the previous window's
count by how much of it overlaps the current moment) closes most of the gap at a small added
cost in bookkeeping. - Token bucket allows the burst to actually reach the backend immediately, which is fine if
the backend can absorb a short spike, but risky if the downstream system (a database, a
third-party API you are proxying) cannot; leaky bucket's smoothing is the better fit when the
concern is protecting a fragile downstream dependency rather than just being fair to callers. - Common wrong turn: setting one limit for everything. A single global rate limit with no
per-client tier lets one high-volume legitimate customer's traffic look identical to abuse, and
forces you to choose between a limit generous enough for your biggest customer (too generous
for abuse defense) or strict enough for abuse defense (too strict for your biggest customer).
Layering per-client limits on top of a global ceiling avoids that false choice. - Common wrong turn: no path for a legitimate high-volume customer who needs more than the
default limit. Rate limiting without a documented, supported way to request a higher
per-client quota turns a capacity-planning conversation into a support escalation every time a
customer scales up.
What is an API gateway, and what security responsibilities does it typically take on for the services sitting behind it?
Sample Answer
Direct answer
An API gateway is a single entry point that sits in front of a set of backend services and handles cross-cutting concerns, routing, traffic management, and security, before a request ever reaches business logic. On the security side, its main value is enforcing cheap, universal checks exactly once, instead of every individual service having to duplicate that logic.
Structured elaboration
Typical security responsibilities a gateway takes on:
- Transport security: terminating TLS (Transport Layer Security) and enforcing HTTPS-only, including a minimum supported TLS version.
- Coarse authentication: validating a token's signature and expiry, or checking an API key, before forwarding the request at all.
- Coarse authorization: confirming this identity is allowed to call this route in general, not the fine-grained "does this caller own this specific record" check, which still belongs inside the service.
- Rate limiting and throttling: protecting the whole platform from abuse or an accidental traffic spike from any single caller.
- Request validation: rejecting malformed, oversized, or wrong-content-type requests early, before they cost any downstream service compute.
- IP allow/deny lists and basic filtering: blocking known-bad sources or request patterns before they reach anything meaningful.
- Centralized audit logging: one place to see every request that entered the system, useful for both security review and debugging.
- Identity propagation: injecting a verified identity (for example, a user-id header) into the forwarded request, so downstream services trust the gateway's verification rather than each re-parsing raw tokens themselves.
Worked example
A POST /orders request arrives with no authentication token. The gateway rejects it with a 401 response before the orders service, inventory service, or payment service ever see it, so none of them spend any compute on traffic that was never going to be allowed. A validly authenticated request for the same endpoint is forwarded along with an X-User-Id header the gateway added after verifying the token, so the orders service can trust that identity without re-validating the raw token itself.
Trade-offs & pitfalls
A gateway should take on responsibilities that are universal and cheap to check without business context, not fine-grained, per-resource authorization, which needs domain knowledge only the service actually has. The most common pitfall is treating the gateway as the only layer of defense: it is a first filter that removes obviously bad traffic early, not a substitute for a service independently checking that a specific caller is allowed to touch a specific resource.
Architect a security model for a large-scale microservices platform (~1000 services) that uses a service mesh (e.g., Envoy/Istio) and an API gateway. Goals: enforce strong service-to-service authentication and authorization, minimize blast radius, centralize policy where sensible but avoid bottlenecks, ensure observability and incident response. Provide key components, identity model, policy enforcement points, rollout plan and scaling considerations.
Sample Answer
Direct answer
At roughly 1,000 services, service-to-service authentication and authorization has to be
enforced by infrastructure (a service mesh sidecar, such as Envoy, paired with a control plane
like Istio) rather than by each service's own application code, because you cannot reliably
audit or update security logic duplicated across a thousand codebases owned by many different
teams. The mesh's sidecar proxies handle mutual TLS (mTLS) and per-request authorization
uniformly, the control plane distributes identity and policy to every sidecar, and the API
gateway stays a separate, thinner layer that only handles edge concerns (external traffic
authentication, coarse rate limiting) rather than trying to be the single point enforcing every
internal rule.
Structured elaboration
Identity model. Every service instance gets a workload identity, most commonly a SPIFFE
(Secure Production Identity Framework For Everyone) identity encoded into a short-lived X.509
certificate, tied to what the workload is (its Kubernetes service account and namespace, for
example) rather than a static shared secret. The mesh's control plane (Istio's istiod, for
example) issues and continuously rotates these certificates automatically; no individual service
team manages its own certificate lifecycle.
Enforcing service-to-service auth and authorization. The sidecar proxy next to each service
terminates and originates mTLS transparently, so two services communicate over an encrypted,
mutually-authenticated channel without either one's application code implementing TLS itself.
Authorization (which services may call which other services, and for which operations) is
expressed as policy (Istio's AuthorizationPolicy resources, for example) and enforced by the
sidecar before a request ever reaches the application, giving every service the same
authorization enforcement mechanism regardless of what language or framework it is written in.
Policy enforcement points. At this scale there are exactly two places policy actually gets
enforced, and each has a distinct job: the API gateway is the enforcement point for traffic
entering the mesh from outside (external clients, partners), handling coarse checks like
authentication and rate limiting once at the edge; each service's own sidecar is the enforcement
point for everything after that, deciding, per call, whether one internal service may reach
another. Keeping these two enforcement points separate, rather than routing all internal traffic
back through the gateway, is what keeps the gateway from becoming a bottleneck for traffic that
never needed to leave the mesh.
Minimizing blast radius. Default-deny between services (a service can only call, or be
called by, the specific services its policy explicitly allows) turns a compromised service into
a contained incident instead of a pivot point to the rest of the fleet; without this, one
compromised service with network reachability to everything else effectively compromises the
whole mesh.
Centralizing policy without creating a bottleneck. Policy is authored and versioned
centrally (so the security posture is auditable in one place, as code) but distributed to
every sidecar so each one can make allow/deny decisions locally, at line rate, without a
synchronous call back to a central decision service on every request. This is the key design
move for enforcing at 1,000-service scale: centralize the authoring and distribution of
policy, not the evaluation of it.
Observability and incident response. Every sidecar can emit consistent access logs, metrics,
and distributed traces for the traffic passing through it, giving uniform visibility across all
1,000 services without depending on each service team to instrument request-level auth logging
themselves. This uniformity is what makes incident response at this scale tractable: a security
team traces a suspicious request across service boundaries using the mesh's own telemetry rather
than reconciling a thousand different logging formats.
Rollout plan. Introduce the mesh incrementally rather than flipping mTLS enforcement on
everywhere at once: start in permissive mode (the sidecar accepts both plaintext and mTLS
traffic while metrics show which callers have and have not migrated), onboard services namespace
by namespace or team by team, and only flip to strict mTLS enforcement for a given service once
its traffic is confirmed fully migrated. A big-bang cutover at 1,000 services risks a
simultaneous outage across the fleet if any meaningful fraction of callers have not yet adopted
the sidecar.
Scaling considerations. The sidecar's own resource footprint (CPU and memory per pod) and the
control plane's config-push fan-out both need capacity planning at this scale; a control-plane
change that pushes new policy to 1,000 sidecars simultaneously needs to be paced (canaried,
rate-limited) rather than broadcast all at once, since a bad policy pushed everywhere
simultaneously turns a policy bug into a fleet-wide outage instead of a contained one.
Worked example
graph TD
Ext[External Traffic] --> GW[API Gateway - Edge AuthN and AuthZ]
GW --> SM[Service Mesh Ingress]
SM --> SVA[Service A plus Envoy Sidecar]
SM --> SVB[Service B plus Envoy Sidecar]
SVA -->|mTLS plus SPIFFE ID| SVB
CP[Istio Control Plane] -.->|distributes policy and certs| SVA
CP -.-> SVB
SVA --> OBS[Telemetry: access logs, traces]
SVB --> OBS
The gateway handles only the edge boundary (authenticating and rate-limiting external traffic
before it enters the mesh at all); everything after that, service A calling service B, for
example, goes sidecar-to-sidecar over mTLS with an authorization decision made locally by
service B's own sidecar, based on policy the control plane already pushed to it. If the control
plane is briefly unavailable, existing sidecars keep enforcing their last-known policy and
certificates until they expire, since evaluation never depended on a live call to the control
plane; only new certificate issuance and policy updates pause during that window, which is
the direct payoff of "centralize distribution, not evaluation."
Trade-offs and pitfalls
- A service mesh adds real operational complexity and per-request latency overhead (an extra
network hop through the sidecar in each direction); this is a deliberate trade against the
alternative of every service reimplementing TLS and authorization independently, which does not
scale to 1,000 services being maintained correctly and consistently over time. The trade-off
is worth stating explicitly rather than presenting the mesh as free. - Permissive mode during rollout is a temporary state, not a target state. Leaving services
in permissive mode indefinitely (common when a migration stalls) means mTLS is not actually
being enforced for those services even though the infrastructure exists, which is easy to miss
in metrics that only measure "sidecar deployed" rather than "strict mode enforced." - Common wrong turn: routing all internal traffic back through the central API gateway to
reuse its authorization logic. This defeats the scaling argument for a mesh in the first place
and turns the gateway into both a latency bottleneck and a single point of failure for traffic
that never needed to leave the mesh's own service-to-service path. - Common wrong turn: pushing a policy change to all 1,000 sidecars simultaneously without a
canary. A syntactically valid but logically wrong authorization policy (an overly broad deny
rule, for example) pushed everywhere at once can cause a fleet-wide outage in the time it takes
the control plane to distribute the update, which is why staged rollout applies to policy
changes, not just to the initial mesh adoption.
You're asked to architect a zero-trust setup for a hybrid environment exposing APIs to internal services, external partners, and mobile clients. Cover identity and access management, device posture checks, short-lived credentials, conditional access policies, service identity, TLS/mTLS, API gateway and enforcement points, and how to support clients in intermittent connectivity scenarios.
Sample Answer
Direct answer
A zero-trust design for a hybrid environment treats every caller, whether it is an internal
service, an external partner, or a mobile client, as untrusted by default and re-verifies
identity and context on every request, rather than granting broad access once a caller is
"inside the network." The core building blocks are strong identity for both users and services
(short-lived credentials instead of static secrets), device and context signals evaluated at
request time (conditional access), and a small number of well-defined enforcement points (an API
gateway plus per-service checks) that consistently apply policy across on-prem, multiple clouds,
and partner networks rather than each environment inventing its own rules.
Structured elaboration
Identity and access management. Every principal (human user, service, and partner
integration) needs a durable, centrally-managed identity, issued by a single identity provider
(or federated set of providers) rather than per-environment local accounts. Users authenticate
via OpenID Connect (OIDC, an identity layer built on OAuth 2.0) with the resulting token carrying
verified claims about who they are; services authenticate to each other using workload identity
(certificates or signed tokens tied to what the service is, not a shared secret it holds).
Device posture checks. For flows that originate from a device (a partner's engineer, a
mobile client), the access decision should factor in device state; whether it is managed,
patched, has disk encryption enabled, is not jailbroken/rooted, rather than trusting the network
location it is calling from. A request from a fully-patched, managed corporate laptop and one
from an unknown personal device should not receive the same default trust even if both present a
technically valid user token.
Short-lived credentials. Replace long-lived static API keys and passwords with
short-lived, automatically renewed tokens wherever the calling pattern allows it: OAuth access
tokens with lifetimes of minutes to a couple of hours, backed by refresh flows, and short-lived
certificates for service identity (paired with automated rotation, discussed further under
mTLS). A short lifetime bounds how long a leaked credential remains useful even if revocation is
delayed.
Conditional access policies. Access decisions combine identity, device posture, and context
(is this request from a location or pattern consistent with the user's history, is it during a
plausible time window, is the requested action unusually sensitive) into a policy evaluated at
request time, not just at login time; a session that started low-risk can be required to
step up (re-authenticate, add MFA) if its behavior later looks anomalous.
Service identity and enforcement points. Between services, mTLS (mutual TLS, where each side
proves its identity with a certificate) paired with a workload-identity standard like SPIFFE (Secure Production Identity Framework For Everyone, a standard for automatically issuing short-lived, verifiable identities to services)
gives every service a verifiable identity independent of network location, which matters
specifically because "hybrid" means you cannot rely on network topology (a private subnet, a VPN
tunnel) as a trust signal the way a single-cloud, single-network design sometimes does. An API
gateway sits at the edge for external and partner traffic as the primary enforcement point for
coarse-grained checks (authentication, rate limiting, gross authorization); internal
service-to-service calls enforce their own finer-grained authorization at each service, since a
single central gateway cannot see or safely encode every service's specific business rules.
Trust boundaries across on-prem, multi-cloud, and partner networks. Segment the environment
into explicit trust zones rather than assuming one flat network, and make every crossing between
zones go through an identity-checked enforcement point instead of being implicitly allowed by
network routing. For the cloud-side permissions surface specifically, CIEM (cloud infrastructure
entitlement management, tooling that inventories and right-sizes the often-sprawling permissions
granted to cloud identities and roles) is the practical mechanism for keeping the
identity-to-permission mapping from drifting into over-privilege as the environment spans
multiple cloud providers, each with its own IAM (Identity and Access Management, the system that governs who or what can access cloud resources) model; operationalize boundary changes with
automated testing (a policy change is deployed through the same CI/CD pipeline as code, with
automated checks that a proposed change does not accidentally widen an existing trust boundary)
rather than manual firewall-rule edits.
Supporting intermittent connectivity. Mobile and some partner clients cannot always reach the
identity provider or policy decision point in real time. Support this with short-lived cached
decisions (a token that remains valid, and whose validity can be checked locally via signature,
for a bounded window even if the issuer is briefly unreachable) rather than a hard requirement
that every single request round-trip to a live policy check; balance that against the same
short-lived-credential principle by keeping the cached window short enough that a revoked
credential is not usable for long after revocation.
Worked example
graph TD
C1[Internal Service] -->|mTLS plus SPIFFE identity| GW[API Gateway - PEP]
C2[External Partner] -->|OAuth token plus mTLS| GW
C3[Mobile Client] -->|short lived token plus device posture| GW
GW --> PDP[Policy Decision Point]
PDP -->|check identity, posture, context| IAM[Identity Provider]
IAM --> PDP
PDP -->|allow or deny| GW
GW --> BE[Backend Services]
The gateway is the policy enforcement point (PEP): it never decides trust on its own, it forwards
the identity and context signals it collected (which credential type, what device posture, what
network origin) to the policy decision point (PDP), which consults the identity provider and
returns an allow or deny. This separation is what lets the same enforcement logic apply
consistently whether the caller is an internal service crossing a cloud boundary, an external
partner, or a mobile client on an unreliable connection: the PEP's job (collect signals, forward,
enforce the verdict) does not change per caller type, only the specific signals available do.
Trade-offs and pitfalls
- A central policy decision point can become a latency and availability bottleneck. Cache
decisions locally at the enforcement point for a short, explicitly bounded window to absorb
brief PDP unavailability and reduce round-trip latency, rather than either making every request
block on a live PDP call or letting enforcement points make their own independent (and
potentially inconsistent) decisions. - Zero trust does not mean zero trust in the credential's assertions once verified, it means
not trusting network location as a substitute for verification; conflating the two leads teams
to over-engineer per-request re-verification for signals (like a properly-scoped, freshly-issued
short-lived token) that were already strongly verified moments earlier. - Common wrong turn: building the identity and policy layer first and treating multi-cloud
CIEM as a later cleanup task. Cloud IAM permissions sprawl quickly and independently of your
application-level zero-trust design; without CIEM-driven visibility from early on, the
"authorized" answer your policy layer gives can still be sitting on top of drastically
over-permissioned cloud roles underneath it. - Common wrong turn: applying identical policy rigor to every zone. A partner integration
handling low-sensitivity data does not need the same conditional-access strictness as an
internal service touching customer financial records; uniform maximum strictness everywhere
usually just produces friction that teams route around, rather than better security.
Unlock Full Question Bank
Get access to all 17 API Security, Authentication and Authorization interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.