A Flutter interface can feel polished while the application underneath still exposes tokens, trusts unsafe connections, or logs private data. This checklist treats security as part of release engineering-not a final scan before publishing.
Start with the mobile threat model
Document what the app stores, which APIs it calls, where trust changes, and what an attacker gains from a rooted device, intercepted request, stolen session, or repackaged build. The client must be treated as observable and modifiable. Authorization and business rules belong on the server even when the interface hides unavailable actions.
1. Store less sensitive data
Do not place access tokens, refresh tokens, API keys, or personal data in ordinary preferences. Use platform-backed secure storage for secrets that must remain on the device, keep token lifetimes limited, and clear session material during logout. A secret compiled into the application is not a secret; move privileged credentials behind an authenticated backend.
2. Protect every network path
Require HTTPS, validate certificates, and remove development overrides that accept invalid certificates. Certificate pinning can reduce interception risk for endpoints you control, but it needs a rotation and recovery plan. Handle failures explicitly instead of silently falling back to an insecure connection.
3. Design authentication for failure
Refresh tokens should rotate, revoked sessions should stop working, and sensitive actions should require recent authentication where appropriate. Avoid assuming that a valid token grants access to every object. Each API request must verify the actor, the requested resource, and the permitted operation.
4. Minimize permissions and platform exposure
Request a permission only when its feature is used and explain why it is needed. Review exported Android components, deep links, URL schemes, clipboard use, screenshots on sensitive views, backups, and inter-process communication. Validate every value received from another application or operating-system intent.
5. Make logs safe for production
Debug output often contains tokens, request bodies, email addresses, or internal endpoints. Disable verbose logging in release builds and redact sensitive fields in error reporting. Crash reports should provide diagnostic context without becoming a second store of private user data.
6. Test the release artifact
Test the signed release build, not only the debug build. Verify secure storage behavior, expired and revoked sessions, offline states, deep links, certificate failures, rooted-device assumptions, API authorization, and obfuscation settings. Automated dependency checks help, but manual abuse cases catch product-specific failures.
A compact release gate
- No privileged secrets are shipped in the app.
- Sensitive local data uses platform-backed protection.
- All traffic uses authenticated, encrypted connections.
- The API enforces object- and function-level authorization.
- Permissions, deep links, logs, backups, and screenshots are reviewed.
- The signed release artifact passes security-focused test cases.
Reference
Use the OWASP Mobile Application Security Verification Standard as a structured baseline for storage, cryptography, authentication, networking, platform interaction, code quality, resilience, and privacy.
