On this page
In short
- Write down what the app protects, who uses it and where it can be reached before choosing tests, so testing effort goes where the risk is.
- Run automated checks in the deployment pipeline on every change: dependency and secret scanning, static analysis and infrastructure-as-code checks.
- Test access control directly: for each role, prove in automated tests that it can reach its own records and nothing else.
- Book an independent penetration test on a production-like environment early enough to fix and retest findings before launch.
- Keep the evidence: scope, reports, fixes, retest results and a record of accepted risks, so the next security review starts from a file, not a scramble.
Where security testing goes wrong
- Testing starts at the end. A penetration test the week before launch finds issues nobody has time to fix, and the launch slips or goes ahead with open findings.
- Access control is assumed. The login works, so the app is called secure, but a user who changes an ID in a request can see another customer's or department's records.
- Old dependencies. A library with a published vulnerability sits in the app because nothing checks for them after the first build.
- Secrets in the wrong place. A database password or API key is committed to the repository or written into a configuration file on a server.
- Cloud settings drift. A storage bucket, security group or role is opened for troubleshooting and never closed.
- No evidence. The work was done, but when a customer's questionnaire asks for the last test report and how findings were handled, nobody can find it.
Questions people ask about an app's security, and what answers them
IT security
- Example question
- Has this app been tested, and are any high findings still open?
- What answers it
- The test report, the fix list and retest results
IT director
- Example question
- Can we launch on the planned date?
- What answers it
- Findings by severity with owners and target dates, and any risks formally accepted
Auditor or customer questionnaire
- Example question
- When was the app last tested, and by whom?
- What answers it
- Dated test reports, the tester's name and the scope
Developer
- Example question
- Does this change bring in a vulnerable library?
- What answers it
- Dependency scan results in the pipeline
Business owner
- Example question
- Can a user in one plant or customer account see another's data?
- What answers it
- Automated access tests for each role
| Who asks | Example question | What answers it |
|---|---|---|
| IT security | Has this app been tested, and are any high findings still open? | The test report, the fix list and retest results |
| IT director | Can we launch on the planned date? | Findings by severity with owners and target dates, and any risks formally accepted |
| Auditor or customer questionnaire | When was the app last tested, and by whom? | Dated test reports, the tester's name and the scope |
| Developer | Does this change bring in a vulnerable library? | Dependency scan results in the pipeline |
| Business owner | Can a user in one plant or customer account see another's data? | Automated access tests for each role |
Start with what the app protects
Before choosing tools, write one page on what the app holds and who could misuse it. A staff app on the internal network with no personal data needs different testing from a customer portal on the internet with order history and contact details.
Example threat notes for one app (your security team decides the content)
What data does it hold?
- Example answer
- Customer contacts, order history and uploaded drawings
- What it changes in testing
- Access tests per customer account, and checks on file upload and download
Who signs in, and how?
- Example answer
- Staff through single sign-on; customers with an email and password plus multi-factor
- What it changes in testing
- Tests of the sign-in flow, sessions and password reset
Where can it be reached?
- Example answer
- Customer pages on the internet; the admin area on the company network only
- What it changes in testing
- Confirm the admin area is unreachable from outside
What can a user change?
- Example answer
- Their own account details and uploads; staff can change order notes
- What it changes in testing
- Tests that users can't change other users' records or reach staff functions
What connects to it?
- Example answer
- A read-only reporting view in your database and an email sending service
- What it changes in testing
- Check the accounts the app uses have only the access they need
| Question | Example answer | What it changes in testing |
|---|---|---|
| What data does it hold? | Customer contacts, order history and uploaded drawings | Access tests per customer account, and checks on file upload and download |
| Who signs in, and how? | Staff through single sign-on; customers with an email and password plus multi-factor | Tests of the sign-in flow, sessions and password reset |
| Where can it be reached? | Customer pages on the internet; the admin area on the company network only | Confirm the admin area is unreachable from outside |
| What can a user change? | Their own account details and uploads; staff can change order notes | Tests that users can't change other users' records or reach staff functions |
| What connects to it? | A read-only reporting view in your database and an email sending service | Check the accounts the app uses have only the access they need |
Published standards help turn this into a checklist. As of 2026, the OWASP Foundation's Application Security Verification Standard (ASVS) is at version 5.0, released in May 2025, with three levels of requirements to match an app's risk, and the OWASP Top 10:2025 lists ten categories of web application security risk, with broken access control first. For mobile apps, OWASP publishes the Mobile Application Security Verification Standard (MASVS). Pick the level and sections that fit the app, and agree them with your security team before building.
Automated checks on every change
Checks that run in the deployment pipeline catch the common problems long before a tester sees the app, and keep catching them after launch. A failed check stops the change from deploying until someone fixes it or records why it is acceptable.
Example pipeline checks (tools vary; the point is that each runs on every change)
Dependency scanning
- What it catches
- Libraries with published vulnerabilities, and outdated packages
- When it runs
- On every change, and on a schedule for newly published issues
Secret scanning
- What it catches
- Passwords, keys and tokens committed to the repository
- When it runs
- On every commit and pull request
Static analysis
- What it catches
- Common coding mistakes such as injection and unsafe input handling
- When it runs
- On every pull request
Infrastructure-as-code checks
- What it catches
- Public storage, open network rules, over-broad roles and missing encryption in the cloud definitions
- When it runs
- Before any infrastructure change deploys
Access control tests
- What it catches
- A role reaching records or functions it shouldn't
- When it runs
- With the app's other automated tests, on every change
Deployment credentials
- What it catches
- Long-lived cloud keys stored in the pipeline
- When it runs
- Set up once: the pipeline signs in to the cloud with short-lived OIDC credentials
| Check | What it catches | When it runs |
|---|---|---|
| Dependency scanning | Libraries with published vulnerabilities, and outdated packages | On every change, and on a schedule for newly published issues |
| Secret scanning | Passwords, keys and tokens committed to the repository | On every commit and pull request |
| Static analysis | Common coding mistakes such as injection and unsafe input handling | On every pull request |
| Infrastructure-as-code checks | Public storage, open network rules, over-broad roles and missing encryption in the cloud definitions | Before any infrastructure change deploys |
| Access control tests | A role reaching records or functions it shouldn't | With the app's other automated tests, on every change |
| Deployment credentials | Long-lived cloud keys stored in the pipeline | Set up once: the pipeline signs in to the cloud with short-lived OIDC credentials |
Access control tests deserve particular attention, because they are specific to your app and no generic scanner can know your rules. For each role, write tests that sign in as that role and try to read and change records it owns, records another account owns and functions reserved for other roles. Our guide to single sign-on and least privilege for internal apps covers designing those roles.
An independent penetration test, planned early
- Independent of the builders. A tester who didn't write the code looks at it the way an attacker would. Your security team, a testing firm or your customer may already have a preferred provider.
- Book it with room to fix. Schedule the test when the app is feature-complete on a production-like environment, with time after it to fix findings and have the tester retest them. For example, two to four weeks before launch leaves room that the week before doesn't.
- Write the scope down. The environments, addresses, roles and test accounts in scope, what is out of scope, testing hours, and who to call if something breaks.
- Test a copy, not production data. Use a staging environment built from the same infrastructure code, with test data instead of real customer records.
- Mobile apps. The app on the phone and the API behind it are both in scope. The API is where the data is, so it gets the same access tests as a web app.
Example handling of findings by severity (your security policy sets the actual rules)
Critical or high
- Example
- One customer can read another's orders by changing an ID
- Example handling before launch
- Fixed and retested before launch
Medium
- Example
- Session doesn't expire after a long idle period
- Example handling before launch
- Fixed before launch, or accepted in writing with a date
Low or informational
- Example
- A server header reveals a framework version
- Example handling before launch
- Scheduled into normal maintenance
| Severity | Example | Example handling before launch |
|---|---|---|
| Critical or high | One customer can read another's orders by changing an ID | Fixed and retested before launch |
| Medium | Session doesn't expire after a long idle period | Fixed before launch, or accepted in writing with a date |
| Low or informational | A server header reveals a framework version | Scheduled into normal maintenance |
Evidence to keep
- The threat notes and chosen standard. The one-page summary of what the app protects, and the ASVS level or checklist agreed with security.
- Pipeline results. Dependency, secret, static analysis and infrastructure checks, with dates, kept for the period your policy sets.
- Test reports and retests. The penetration test report, the scope it covered, the tester's name and date, and the retest results for fixed findings.
- Accepted risks. Any finding not fixed, with the reason, who accepted it and the review date.
- Architecture and data flow. A current diagram of where the app runs, what it connects to and where data is stored, which security questionnaires ask for.
Keep this with the app's handover documents rather than in someone's inbox. Our guide to what a proper software handover should include covers the rest of that file.
After launch
- Pipeline checks keep running. New vulnerabilities are published against libraries you already use; scheduled dependency scans catch them between releases.
- Retest on significant change. A new role, a new kind of user or a new integration is a reason to test again, not only a calendar date. Many security policies also set a regular interval, for example yearly.
- Patch on a schedule. Agree who applies updates to libraries, runtimes and the operating environment, and how quickly by severity. Our guide to what a proper software handover should include covers support options after handover.
- Watch the logs. Sign-in failures, access denials and unusual volumes should reach someone through alerts, not wait for a monthly review.
Who does which part
Who typically covers each part of security testing (agree it in the contract)
Threat notes and chosen standard
- Typically done by
- The development team with your security team
- What to check
- That security signed off on the scope before building
Pipeline checks and access tests
- Typically done by
- The development team, as part of the build
- What to check
- That the checks are in the pipeline you'll own, not only on the developer's machine
Penetration test
- Typically done by
- An independent tester chosen by you or your security team
- What to check
- Scope, dates, retest included, and who receives the report
Fixes and retest
- Typically done by
- The development team, then the tester
- What to check
- Whether fixes to findings are within the fixed price or quoted separately
Ongoing scanning and patching
- Typically done by
- Your team or a support agreement
- What to check
- Who is alerted, and how quickly each severity is handled
| Part | Typically done by | What to check |
|---|---|---|
| Threat notes and chosen standard | The development team with your security team | That security signed off on the scope before building |
| Pipeline checks and access tests | The development team, as part of the build | That the checks are in the pipeline you'll own, not only on the developer's machine |
| Penetration test | An independent tester chosen by you or your security team | Scope, dates, retest included, and who receives the report |
| Fixes and retest | The development team, then the tester | Whether fixes to findings are within the fixed price or quoted separately |
| Ongoing scanning and patching | Your team or a support agreement | Who is alerted, and how quickly each severity is handled |
Whichever way the work is split, write it into the proposal. Our guide to questions to ask before hiring a software development firm covers security review alongside ownership and handover.
Planning a custom app that has to pass security review?
Bring your security team's requirements, a note on what the app will hold and who will use it, and your launch date. On a scoping call we'll talk through the pipeline checks, access tests, test timing and what a fixed-price build would include.
Questions to settle before you build
Take this to IT security, the business owner, the development team and procurement
- What data will the app hold, who signs in, and where can it be reached?
- Which standard or checklist, and which level, has security agreed for this app?
- Which automated checks run in the pipeline, and what stops a deployment?
- Which roles exist, and are there automated tests that each one sees only its own data?
- Who performs the penetration test, on which environment, and when?
- How are findings handled by severity, and who can accept a risk?
- Where are test reports, fixes and accepted risks kept, and for how long?
- Who scans, patches and retests after launch?
If the app isn't written down yet, our project brief builder asks eight short questions and turns the answers into a one-page brief you can share with security and IT before a call.
Our experience includes full-stack web applications, native iOS and cross-platform mobile apps, OAuth and OIDC authentication flows, security hardening and compliance practices, and CI/CD pipelines with GitHub Actions and OIDC on AWS. See custom software development for how we'd approach a build like this, and how we work for the fixed-price process.
Sources
See it applied
- Illustrative sample. Not client work.See a sample scope for an internal tool →An invented request and approval portal that replaces a spreadsheet and email, on an existing SQL Server database with the company's existing single sign-on.
- Illustrative sample. Not client work.See a sample handover package →The handover index for an invented plant-floor dashboard: repositories, infrastructure as code, the pipeline, runbooks, a data dictionary, the credential handover list, alerts, known limitations and sign-off.
Share this guide
Related services
- Custom software development Internal tools and integrations built to work with the systems you already run, quoted at a fixed price.
- Web application development Web applications and customer-facing sites built with React, Next.js and TypeScript, quoted at a fixed price.
- AWS cloud & DevOps Infrastructure as code, deployment pipelines and monitoring for what we build.