Home/Services/Single Page Application Testing
security service

Single Page Application Testing

Security-focused single page application testing across Europe: SPA client logic, JWT storage, API authorization, DOM XSS and GraphQL. Get a fixed quote.

Manual, expert-ledEvidence-based findingsFree remediation retest

Single application testing for a modern SPA is really two jobs: the JavaScript front end in the browser, and the API doing the real work behind it. We test both, because the interesting flaws almost always live in the gap between what the front end shows and what the API will actually do.

A Single Page Application feels like one smooth product to the user. To an attacker it is a public JavaScript bundle plus an API that trusts far more than it should. React, Angular and Vue moved logic into the browser, and a lot of teams accidentally moved security decisions there too. Hiding a button, disabling a menu item or checking a role in client code stops nobody who can open developer tools and replay the request. SafetyBis is a European offensive-security team, and we test SPAs by going straight at the API the front end is trying to protect.

What single page application testing covers

The front end is a rendering layer. Every security control that matters has to be enforced on the server, so that is where most of the engagement goes, but the client side has its own genuine bugs too. Here is the scope of a proper single page application penetration testing effort.

Broken object-level authorization on REST and GraphQL endpoints, tested by swapping IDs and roles
Token storage and handling: JWT in localStorage, refresh-token flows and silent renewal
Client-side access control that only hides UI, bypassed by calling the API directly
DOM-based cross-site scripting in framework sinks and unsafe rendering paths
CORS policy and cross-origin misconfiguration that exposes authenticated API responses
GraphQL introspection, deep-query abuse and per-mutation authorization gaps
Secrets and internal endpoints leaking through the JavaScript bundle and source maps

Why the front end is not the boundary

This is the mistake we see most. A team ships a beautiful Angular app that hides the admin panel from ordinary users, and assumes the job is done. It is not. The browser is fully under the user’s control. Anyone can read the bundle, see every route and API call, forge requests in Burp Suite, and ask the server for whatever they want. If the API does not check who is asking on every single call, the SPA is wide open, no matter how careful the front end looks.

The API is the real target

Behind every SPA is a REST or GraphQL API, and that is where we spend most of the time. We enumerate every endpoint the app calls, then test each one for missing authorization, object-level access flaws and mass-assignment. A single endpoint that returns another user’s data when you change one number in the request is often the whole finding.

How we approach single application testing

The work is manual and led by engineers who hold OSCP and OSWE. Automated tools struggle with SPAs because the app renders in JavaScript and the real surface is the API, not the HTML a crawler sees. We drive the app like a user, capture the traffic, then attack the API directly.

48h
typical time to first critical findings
API
tested directly, not just through the UI
Free
retest after your team ships the fixes

Mapping the client and the API

We proxy the application through Burp Suite and exercise every feature, capturing each REST call and GraphQL operation. We read the JavaScript bundle and source maps for routes, feature flags, hidden admin functions and, more often than teams expect, hardcoded keys or internal URLs that were never meant to ship to the browser.

Attacking authorization

With a full map of the API, we test access control the only way that proves anything: with multiple accounts. We take a low-privilege user’s session and try to reach a higher-privilege user’s data and a higher-privilege user’s actions.

Horizontal access: IDOR

We change identifiers in requests to reach records that belong to other users or other tenants. In SPAs this is common, because the front end only ever requests the current user’s ID and the developers assumed nobody would ask for another.

Vertical access: privilege escalation

We call admin-only endpoints from an ordinary account. If the API decides what you can do based on a role claim in a token you can tamper with, or worse, based only on which button the front end showed you, escalation follows quickly.

Tokens, sessions and client-side XSS

SPAs usually authenticate with tokens, and where those tokens live matters. A JWT in localStorage is readable by any script on the page, which turns any XSS into full account takeover. We test how tokens are stored, whether they expire and rotate, how refresh flows behave, and whether the app is vulnerable to DOM-based XSS through framework sinks like dangerouslySetInnerHTML or unsanitised template binding.

Vulnerability classes specific to SPAs

Every SPA has its own bugs, but a few classes come up again and again in this architecture.

Broken object-level authorization

The signature SPA vulnerability. The API exposes granular endpoints and trusts the ID in the request. We enumerate objects and confirm whether one user can read or modify another’s, then show the exact request that does it.

GraphQL-specific weaknesses

Where the API is GraphQL, we check whether introspection is exposed, whether deep nested queries can exhaust the server, whether aliasing bypasses rate limits, and whether each mutation independently verifies ownership. A single unguarded mutation can undo an otherwise careful schema.

CORS and cross-origin data exposure

A permissive CORS policy that reflects the origin and allows credentials lets a malicious site read your authenticated API responses in a victim’s browser. We test the policy against real attacker origins rather than trusting the config file.

Information leakage through the bundle

Front-end code ships to everyone. We comb the JavaScript for API keys, third-party tokens, internal hostnames and debug endpoints. It is remarkable how often a paid third-party service key ends up sitting in a public bundle.

Get a fixed quote

Want this tested on your own systems?

Free 20-minute scoping call, a fixed price with no hourly surprises, and a free retest once you fix what we find.

Get a fixed quote

What you get: the deliverables

You get a report your developers can act on and your leadership can understand.

Executive summary

A short, non-technical read: the overall risk, the issues that need attention now, and what they would mean if exploited against your users.

Technical report

Each finding comes with the affected endpoint, a CVSS score, business impact, the exact request and response, step-by-step reproduction, and a specific fix. Where the flaw is client-side, we say so; where it is the API failing to enforce a rule, we say that too, so nobody fixes the wrong layer.

Free retest

After your team ships the fixes, we re-test every finding at no extra cost and update the report to reflect what is genuinely closed.

Compliance and standards

SPA testing maps to the frameworks European businesses report against.

OWASP Top 10 and API Security Top 10

We map findings to the OWASP Top 10 and, because the API carries the risk, the OWASP API Security Top 10, which is written precisely for the broken-authorization problems SPAs create.

ISO 27001, SOC 2, PCI DSS and GDPR

The report and attestation letter are built to support ISO 27001, SOC 2, PCI DSS requirement 11 and GDPR obligations around protecting personal data. Tell us your framework and we align the deliverables so the test counts as evidence.

Why manual testing beats a scanner on SPAs

A scanner sees the initial HTML of a React app, which is nearly empty, and a handful of API calls it does not understand the authorization model for. It cannot know that this GET should refuse a different user’s ID, or that this GraphQL mutation forgot to check ownership. Those are logic decisions, and finding them takes a person with two accounts, a proxy and the patience to try the request the front end would never send. That is the entire value of the engagement.

Frameworks and architectures we test

The framework changes the syntax of the bugs, not their nature. Familiarity with each one is what lets us go straight to the dangerous sinks instead of learning the codebase on your budget.

React, Angular and Vue

Each has its own unsafe rendering paths. React has dangerouslySetInnerHTML, Angular has bypassSecurityTrust and template injection, Vue has v-html. We know where each framework lets untrusted data reach the DOM, and we test those paths directly rather than fuzzing blindly.

Shared APIs behind web and mobile

Many SPAs share their API with a mobile app. That is worth flagging, because a broken authorization check does not care which client sends the request. When we find an IDOR in the API your web front end uses, the same flaw is usually reachable from the phone in every customer’s pocket, which raises the real-world impact of the finding.

Server-side rendered and hybrid apps

Next.js, Nuxt and similar frameworks blur the line between client and server. We check whether server-rendered payloads leak fields the UI intends to mask, and whether data-fetching functions enforce the same authorization the client-side routes assume.

Pricing

Pricing depends on scope: how large the API surface is, how many user roles and tenants exist, and whether we test authenticated flows in depth. Here is the shape of a typical European engagement.

Engagement What’s included Timeline Price
Essential Single SPA with one user role, its REST or GraphQL API, DOM XSS and token handling, full report and free retest 3–5 working days from €2,500
Standard SPA with several roles and a broad API, authorization testing across tenants, CORS and bundle review, executive and technical report 5–8 working days €3,500–€8,000
Advanced Complex SPA, deep SSO and token flows, payment or multi-tenant isolation, attack-chaining across client and API 8–12 working days €8,000–€20,000
Compliance add-on Framework mapping and attestation letter for PCI DSS, ISO 27001, SOC 2 or GDPR with any tier from €800
Custom / large estate Several front ends and APIs or a full platform, scoped to what you run on scoping custom

Every engagement is fixed-price, quoted after a free 20-minute scoping call, with no hourly surprises and a retest included. Get a fixed quote

FAQ

How much does single application testing cost?
It starts from €2,500 for a single SPA and its API, and scales with the number of roles, tenants and endpoints in scope. You get a fixed single application testing cost after a free scoping call.
How long does a single page application test take?
A typical single page application penetration testing engagement runs 5–8 working days plus the report. Anything critical is reported to you the same day we confirm it.
Do you test the front end, the API, or both?
Both, with most of the effort on the API, because that is where the enforceable controls live. Client-side issues like DOM XSS and token storage are tested too, but a secure SPA is really a secure API with a tidy front end.
Do you cover GraphQL as well as REST?
Yes. We test GraphQL for introspection exposure, deep-query abuse, alias-based rate-limit bypass and per-mutation authorization, alongside standard REST endpoint testing.
We use JWTs in localStorage. Is that a problem?
It can be. A token in localStorage is readable by any script, so any XSS becomes account takeover. We test your token storage, expiry and refresh flows and tell you exactly what your exposure is and how to reduce it.
Will the test disrupt our production environment?
No. We agree the rules of engagement first, prefer a staging mirror for intrusive checks, and can test out of hours. Availability is never the price of finding a flaw.
Is a retest included?
Yes, free. Once you have fixed the findings we re-test each one and update the report so you have clean evidence for your auditor or customer.
Do you do performance or load testing too?
No. We are a security team, so this engagement is about vulnerabilities, not speed. For performance work you want a different specialist; we will happily focus on keeping your SPA and its API secure.

Related services

Who needs this

Teams shipping a React, Angular or Vue single page application backed by a REST or GraphQL API, especially where the app is multi-tenant or handles personal or payment data and the security decisions must be proven to live on the server.

why safetybis

Security you can prove

The same standard on every engagement, big or small.

Evidence, not opinions

Every finding ships with a reproduction and proof of concept — no vague "maybe vulnerable".

Humans over scanners

Certified engineers find the logic flaws and chained attacks automated tools walk straight past.

Fixed price, free retest

You know the cost up front, and verifying the fix is part of the deal — not a second invoice.

500+
assessments delivered
<30min
incident first response
12k+
infections removed
98%
fixed within one retest
$ safetybis quote --service "Single Page Application Testing"

Ready to lock this down?

Free scoping call, fixed price, free retest. Tell us what you're running and we'll take it from there — usually within one business day.

get in touch

Tell us what you're running

Scoping is free. We reply within one business day, and under 30 minutes for active incidents.