Security notes
How Frontdoor protects sign-in, sessions and data, what you must configure safely, and how to report a vulnerability.
On this page
Frontdoor sits in front of your internal applications and handles authentication. This page sums up how it protects them and what is up to you.
Sign-in and sessions
- The OAuth flow uses PKCE (S256) and a single-use
statestored on the server for 10 minutes. The state is bound to the browser that started the sign-in through a short-lived httpOnly cookie (frontdoor_auth_nonce). The code verifier never leaves the server. - Tokens from Microsoft are validated by the MSAL library, with signature checks against Microsoft's public keys.
- The session token Frontdoor issues is stored only in an httpOnly cookie, not readable by JavaScript. The user profile sent to the browser does not include the token.
- People listed in
ADMIN_EMAILSare promoted to owner at sign-in and cannot be demoted from the web interface.
Built-in hardening
- Content Security Policy through Helmet, with a per-response form-action allowance for SSO POST redirects.
- Parameterized SQL everywhere, no string interpolation.
- Sanitization: pasted SVG icons and rich text pass through DOMPurify; HTML tags are stripped from user-supplied text fields.
- Cross-site request check: requests that change data with the session cookie must come from Frontdoor or from an origin in
CORS_ALLOWED_ORIGINS. - Rate limiting on sign-in, the API, group and user changes, and the token introspection endpoint. The first three are tunable (see Configuration reference); the introspection limit is fixed at 120 requests per minute.
- No personal data in logs: emails, names and tokens are never written to the server console.
- Startup validation: Frontdoor stops at startup if a required secret is missing.
What you must get right
- Use a unique, random
JWT_SECRETof at least 32 characters. - Rotate the Entra client secret periodically and never commit it to source control.
- Never expose Dev Login. It lets anyone pick any role, and the demo profile signs tokens with a public fallback secret. Production (
NODE_ENV=production) always disables it. - Share
JWT_SECRETonly with fully trusted apps: an app that holds it can verify Frontdoor tokens, but could also sign them. Use token introspection for the others. See Authentication for satellite apps. - List in
CORS_ALLOWED_ORIGINSonly the origins that really need to call Frontdoor with credentials.
Report a vulnerability
Do not open a public issue for a security vulnerability. Use GitHub's private vulnerability reporting on the Frontdoor repository (Security → Report a vulnerability). If that option is not available, contact a maintainer through GitHub and ask for a private channel.
Include:
- a description of the issue and the impact you observed
- steps to reproduce, or a minimal proof of concept
- the affected version or commit
- your assessment of severity, if you have one
| Stage | Target |
|---|---|
| Acknowledgement of the report | within 72 hours |
| Initial severity assessment | within 7 days |
| Fix for critical issues | within 30 days of confirmation |
| Coordinated public disclosure | after a fix is released, or by mutual agreement |
Only the latest minor release of 1.x is supported, so keep your installation up to date (see Upgrade and rollback).
Good-faith research that follows this policy will not be pursued legally: avoid degrading the service for others, do not access or change data that is not yours, and give the maintainers reasonable time to fix the issue before disclosing it.