Your Deploy Just Went Live. Now Run This Security Checklist.
Shipping is the goal. But in the five minutes between "deployed to Vercel" and "posted the link on Twitter," automated scanners are already probing your new domain. Here's what to check — and how to check it in under 60 seconds.
The average time between a new domain appearing in certificate transparency logs and the first automated security probe: under 10 minutes. Attackers don't wait for you to get traction — they scan everything, looking for easy wins.
Most post-deploy security failures aren't sophisticated. They're the same seven issues, in the same order, on almost every new app. This checklist covers all of them. You can check most of these manually, or run a Scantient scan and get all of them in one result in 60 seconds.
SSL Certificate Valid and Not Expiring Soon
CriticalYour SSL certificate is the first thing every visitor's browser checks. If it's expired, every user sees a security warning and most will leave immediately. If it's about to expire (within 30 days), you're one missed renewal away from a complete site outage.
What to verify: Certificate is valid. Expiry is more than 30 days away. Auto-renewal is configured (Let's Encrypt on most platforms handles this). HTTPS is enforced — HTTP requests redirect to HTTPS, not serve content.
Common failure mode: You set up Let's Encrypt manually six months ago. The cron job for renewal failed silently. You find out when a customer emails you that your site is "not secure."
How to check: Run a scan on your domain and check the certificate validity and expiry date. Set a reminder 30 days before expiry for any cert you manage manually.
Security Headers Are Present and Correct
HighSecurity headers are HTTP response headers that tell browsers how to handle your app. They're invisible to users but protect against XSS, clickjacking, MIME sniffing, and protocol downgrade attacks. Missing them is a free vulnerability that requires no exploitation — it's just not protected.
The five headers you need: Strict-Transport-Security (HSTS), Content-Security-Policy (CSP), X-Frame-Options, X-Content-Type-Options, Referrer-Policy.
In Next.js, add them in next.config.js under the headers() function. In Express, use the helmet middleware — it adds all of these in one line.
How to check: An external scan checks for all five headers and tells you which are missing. Takes 60 seconds.
No API Keys Exposed in Client-Side Code or Responses
CriticalThis is the most common critical finding in post-deploy scans — and the most embarrassing, because it's entirely preventable. An API key that leaks in a JavaScript bundle or API response is immediately readable to anyone who opens DevTools.
What gets exposed: OpenAI API keys (someone racks up a huge bill). Stripe secret keys (someone processes fraudulent charges). Supabase service role keys (someone reads your entire database). AWS credentials (someone mines crypto in your account).
The rule: any key that says 'secret,' 'private,' or 'service_role' stays on the server. Use NEXT_PUBLIC_ only for genuinely public configuration (publishable Stripe keys, analytics IDs, feature flags).
How to check: Scan your JavaScript bundle and API responses for key patterns. Scantient checks for 20+ formats including all major cloud providers and LLM APIs.
CORS Is Locked to Your Domain
HighCORS (Cross-Origin Resource Sharing) controls which websites can make requests to your API from a browser. If you set Access-Control-Allow-Origin: * (the developer's shortcut when CORS errors appear), you've told every website in the world they can make requests to your API.
For most APIs, this means: malicious sites can read your users' data on their behalf (using their session cookies). For AI APIs, it also means: attackers can run LLM inference at your expense from any website.
The correct setting for production: Access-Control-Allow-Origin: https://yourapp.com — your specific domain only.
How to check: External scans probe your API endpoints and check CORS headers. Wildcard policies are flagged immediately.
Debug and Sensitive Endpoints Return 404
HighWithin minutes of a new domain appearing in DNS, automated scanners probe it for common sensitive paths. These include: /.env, /.git/HEAD, /api/debug, /admin, /phpinfo.php, Spring Boot actuators like /actuator/health, /actuator/env, and dozens more.
If any of these return 200 (OK), they're exposing data. A /.env response leaks your entire environment. A /.git/HEAD response confirms your stack. A /api/debug endpoint might expose request logs, user data, or internal state.
The fix isn't just 403 Forbidden — return 404. A 403 tells an attacker the endpoint exists and they just can't access it. A 404 is a dead end.
How to check: A good external scan tests 15+ of these paths automatically. Check your scan results for any that return 200.
Content Security Policy Is Configured (Not Just Present)
MediumAdding a Content-Security-Policy header is step one. But a misconfigured CSP provides false security. Common mistakes: using unsafe-inline without a nonce (defeats the purpose of CSP), using wildcard source directives (script-src *), or setting a CSP that's so restrictive it breaks your app and gets removed.
A well-configured CSP prevents: XSS attacks from executing injected scripts, data exfiltration to unauthorized domains, clickjacking and UI redressing.
Start with report-only mode if you're not sure: Content-Security-Policy-Report-Only lets you test your policy without breaking anything. Tighten it over time.
How to check: Check that your CSP header is present, non-trivial (not just script-src *), and includes a nonce or hash for inline scripts.
Rate Limits Are Active on API Endpoints
MediumRate limiting is what stands between your production infrastructure and a script that hammers your API 10,000 times per minute. Without it: your database gets overloaded, your LLM bill spikes, and a determined attacker can brute-force auth endpoints.
For AI apps specifically, rate limiting is critical — every unprotected request to an LLM endpoint costs you money. For auth endpoints (login, signup, forgot-password), rate limiting prevents credential stuffing attacks.
Minimum viable rate limiting: 100 requests/minute per IP on API endpoints. Stricter for auth endpoints (10/minute). Stricter still for LLM endpoints (10/minute per user).
How to check: Check for X-RateLimit-Limit and X-RateLimit-Remaining headers in your API responses. Their absence doesn't always mean no rate limiting, but their presence confirms it.
The Quick Reference: Paste This Into Your Launch Checklist
- ✅ SSL certificate valid, expires in 30+ days, auto-renewal active
- ✅ HTTPS enforced — HTTP redirects to HTTPS
- ✅ Security headers present: HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy
- ✅ No secret API keys in JavaScript bundle or API responses
- ✅ CORS locked to specific origins (no wildcard
*) - ✅ Sensitive paths return 404: /.env, /.git/HEAD, /api/debug, /admin
- ✅ CSP is non-trivial and configured with a nonce or hash
- ✅ Rate limiting active on API endpoints (especially auth and LLM endpoints)
- ✅ External security scan run — Scantient checks all of the above in 60 seconds
The One Command That Replaces Most of This
You can manually check headers with curl -I https://yourapp.com. You can inspect your JavaScript bundle in DevTools. You can probe your own sensitive paths.
Or you can paste your URL into Scantient and get all seven checks — with severity ratings and specific fix instructions — in 60 seconds. No signup. No SDK. No setup.
The free scan covers everything in this checklist. If you want continuous monitoring (alerts when your security posture changes after each deploy, monthly compliance reports), the lifetime deal is $79. One-time payment, no recurring fees — worth it for peace of mind on every future deploy.
For AI apps specifically, add the items from our guide on securing your AI app's API to this checklist — LLM endpoints have additional risks (rate limiting, CORS, prompt injection) that go beyond what standard security scanners check.
Run your post-deploy security scan now
60 seconds. No signup. No SDK. Scantient checks every item on this list automatically.