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.
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.
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.
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.
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.
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?
How long does a single page application test take?
Do you test the front end, the API, or both?
Do you cover GraphQL as well as REST?
We use JWTs in localStorage. Is that a problem?
Will the test disrupt our production environment?
Is a retest included?
Do you do performance or load testing too?
Related services
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.
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.
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.
Tell us what you're running
Scoping is free. We reply within one business day, and under 30 minutes for active incidents.