Explain PHP session handling and common security concerns.
Sessions persist state across stateless HTTP requests. session_start() creates or resumes a session identified by a cookie (PHPSESSID) and stores data server-side.
Security checklist:
- Regenerate the ID on privilege change: session_regenerate_id(true) after login to prevent session fixation.
- Set cookie flags: HttpOnly, Secure, and SameSite=Lax or Strict.
- Use session.use_strict_mode to reject unknown IDs.
- Store sessions outside the web root or in Redis for scale.
- Add CSRF tokens to state-changing forms.
- Set an idle timeout and destroy sessions on logout with session_destroy().
For APIs, prefer stateless tokens (JWT or opaque tokens) over PHP sessions.