Security Checklist for Mobile Banking Apps (2026)
Mobile banking apps are among the highest-risk software you can build. A single vulnerability can expose millions of users' financial data, trigger regulatory action, and destroy brand trust overnight. This checklist covers every security layer I apply when building or auditing fintech and banking apps—from authentication to incident response.
Quick Navigation
1. Authentication & Session Management
Authentication is the front door. Most breaches start here—either through weak credentials, stolen tokens, or session fixation. Here's the full checklist:
Token Lifecycle
- Use short-lived access tokens (15 min) with refresh tokens (7–30 days)
- Rotate refresh tokens on every use (refresh token rotation)
- Invalidate all tokens server-side on logout — do not rely on token expiry alone
- Store access tokens in memory only — never in UserDefaults, NSUserDefaults, or SharedPreferences
- Store refresh tokens in the iOS Keychain with
kSecAttrAccessibleWhenUnlockedThisDeviceOnly - Bind tokens to device fingerprint to prevent replay from another device
Biometric & MFA
- Use Face ID / Touch ID via LocalAuthentication framework as a second factor, not a replacement for server-side auth
- Never use biometric auth result alone to grant access — always validate against your backend
- Require MFA for high-value actions: transfers, password changes, new payee addition
- Implement step-up auth — re-authenticate for sensitive operations within a session
- Support time-based OTP (TOTP) — avoid SMS OTP where possible (SIM-swap risk)
Session Controls
- Auto-lock after 5 min inactivity — configurable but defaulted conservatively
- Clear sensitive UI data (account numbers, balances) when app moves to background
- Prevent screenshots on sensitive screens using
UIScreen.main.isCapturedandUITextField.isSecureTextEntry - Limit concurrent sessions per user — alert or force logout older sessions
2. API & Network Security
Transport Security
- Enforce TLS 1.2+ — reject TLS 1.0/1.1 connections at the server level
- Implement SSL/TLS certificate pinning — pin to leaf cert hash, not CA root
- Include a backup pin for cert rotation without forcing an app update
- Enable App Transport Security (ATS) with no exceptions — never use
NSAllowsArbitraryLoadsin production - Validate the full certificate chain, not just the leaf
Request Integrity
- Sign API requests with HMAC using a per-session secret — prevents request tampering
- Include a timestamp nonce in every request to prevent replay attacks (±5 min window)
- Use
Authorization: Bearer <token>headers — never put tokens in query strings - Implement request rate limiting on the server — expose to mobile via HTTP 429 with Retry-After
- Return generic error messages — never expose stack traces, DB errors, or field validation details to the client
3. Data Storage & Encryption
What Goes Where
- Keychain: Tokens, passwords, private keys, PINs — use
kSecAttrAccessibleWhenUnlockedThisDeviceOnly - CoreData / SQLite: Financial records — encrypt at rest using SQLCipher or iOS Data Protection class
NSFileProtectionComplete - UserDefaults: Non-sensitive UI preferences only — never store tokens, account data, or PII here
- Cached images/PDFs: Encrypt the NSURLCache and mark files with
NSFileProtectionComplete - Clipboard: Clear clipboard contents containing sensitive data after 60 seconds
Encryption Standards
- Use AES-256-GCM for symmetric encryption — provides both confidentiality and integrity
- Use the Secure Enclave for key storage when available (iPhone 5s and later)
- Never hardcode encryption keys — derive them from user credentials + device-bound secret
- Wipe sensitive data from memory explicitly after use — zero-fill sensitive byte arrays
4. Device & Runtime Integrity
Jailbreak Detection
Jailbroken devices bypass iOS sandbox protections — Keychain items can be extracted, SSL pinning bypassed, and runtime behavior modified. No detection is 100% reliable, but layered checks raise the cost of attack significantly:
- Check for presence of
/Applications/Cydia.app,/usr/bin/ssh,/bin/bash - Attempt to write outside the app sandbox — should fail on non-jailbroken devices
- Check if
fork()succeeds — restricted on non-jailbroken iOS - Verify the app's code signature at runtime
- Use multiple independent checks — don't rely on a single signal
- On detection: degrade gracefully — warn user, disable high-risk features, log the event server-side
Runtime Attack Detection
- Detect if a debugger is attached using
PT_DENY_ATTACH— terminates debug sessions in production - Check for method swizzling on security-critical code paths
- Detect if running in a simulator — disable production credentials in simulator builds
- Use
DeviceCheckandAppAttest(iOS 14+) to verify app integrity server-side
5. Code Hardening & Obfuscation
- Enable all compiler security flags:
-fstack-protector-all,-D_FORTIFY_SOURCE=2 - Enable Position Independent Executable (PIE) — randomizes memory layout at runtime
- Strip debug symbols from release builds — never ship a binary with symbols
- Obfuscate sensitive string constants (API endpoints, key identifiers) — tools: iXGuard, Dotfuscator
- Remove all
NSLog,print, and debug output in production builds using compile-time flags - Disable JavaScript injection if using WKWebView — set
allowsContentJavaScript = falseunless required - Audit third-party SDKs — every SDK you add is an attack surface. Review permissions, data collection, and update cadence
6. Logging — What NOT to Log
Logs are frequently overlooked as an attack vector. On iOS, NSLog output is readable by any app on a jailbroken device. Server logs are often less protected than the app itself.
Never Log
- Full account numbers, card numbers, CVV
- Auth tokens, refresh tokens, session IDs
- Passwords (even hashed)
- Full API request/response bodies
- PII: SSN, DOB, full address
- Biometric data or device identifiers
Safe to Log
- Event types (login_attempt, transfer_initiated)
- Masked identifiers (last 4 of account)
- Error codes and HTTP status codes
- Request duration and latency
- Feature flags and A/B experiment IDs
- Anonymous session IDs (not linked to user)
Server-Side Audit Logging
- Log all authentication events with timestamp, IP, device fingerprint, and outcome
- Log all high-value transactions with user ID, amount, and counterparty (masked)
- Log all admin actions and config changes
- Ship logs to a SIEM (Splunk, Datadog, AWS CloudWatch) — retain for 90 days minimum
- Set up alerts for: brute force patterns, impossible travel, unusual transaction volumes
7. Incident Response Readiness
Security without incident response is incomplete. When (not if) something goes wrong, your ability to detect, contain, and communicate quickly determines the outcome.
Kill Switches
- Build a remote feature flag system — ability to disable any feature without an app update
- Build a forced-update mechanism — ability to block old app versions immediately
- Build server-side session revocation — invalidate all sessions for a user or all users instantly
Detection & Response Playbook
- Define P0/P1/P2 severity levels with response SLAs before launch
- Assign a security incident owner — single point of accountability
- Prepare user notification templates for credential exposure scenarios
- Know your regulatory notification obligations: PCI-DSS requires 72-hour breach notification, GDPR even faster
- Run tabletop exercises quarterly — simulate a breach scenario with your team
Security Audit Checklist Summary
Related Services & Further Reading
Need a Security Audit for Your Mobile Banking App?
I provide mobile security audits covering all layers in this checklist — authentication, API hardening, storage, runtime integrity, and logging. Get a prioritized report with specific fixes within 2-3 weeks.