Get a Pentest and security assessment of your IT network.

Cyber Security

Secure Authentication: Preventing Cookie Hijacking

TL;DR

Cookie hijacking happens when someone steals a user’s session cookie and pretends to be them. To stop this, use these techniques:

  • HTTPOnly cookies: Prevent JavaScript from accessing the cookie.
  • Secure cookies: Only send the cookie over HTTPS.
  • SameSite cookies: Control when cookies are sent with cross-site requests.
  • Short session timeouts: Limit how long a cookie is valid.
  • Regularly regenerate session IDs: Change the cookie value frequently.
  • Consider using tokens (like JWTs) instead of cookies: More secure for some applications.

How to Prevent Cookie Hijacking

Here’s a step-by-step guide to make your authentication more secure against cookie hijacking:

1. Use HTTPOnly Cookies

HTTPOnly cookies can’t be accessed by JavaScript code in the browser. This stops attackers from using cross-site scripting (XSS) attacks to steal the cookie.

  • How it works: When you set a cookie, add the HttpOnly flag.
  • Example (PHP):

    setcookie('session_id', $sessionId, ['httponly' => true]);
  • Example (Python/Flask):

    response.set_cookie('session_id', session_id, httponly=True)

2. Use Secure Cookies

Secure cookies are only sent over HTTPS connections. This prevents attackers from intercepting the cookie during transmission.

  • How it works: Add the Secure flag when setting the cookie. Make sure your entire site uses HTTPS!
  • Example (PHP):

    setcookie('session_id', $sessionId, ['secure' => true]);
  • Example (Python/Flask):

    response.set_cookie('session_id', session_id, secure=True)

3. Implement SameSite Cookies

SameSite cookies control when the browser sends the cookie with cross-site requests. This helps prevent Cross-Site Request Forgery (CSRF) attacks and adds another layer of protection against hijacking.

  • Options:
    • Strict: The cookie is only sent with requests originating from the same site.
    • Lax: The cookie is sent with same-site requests and top-level navigation (e.g., clicking a link). This is generally a good default.
    • None: The cookie is sent with all requests, but requires Secure to be set.
  • Example (PHP):

    setcookie('session_id', $sessionId, ['samesite' => 'Lax']);
  • Example (Python/Flask):

    response.set_cookie('session_id', session_id, samesite='Lax')

4. Short Session Timeouts

Reduce the amount of time a cookie is valid. If an attacker steals a cookie, it will only be useful for a short period.

  • How it works: Configure your server to automatically invalidate sessions after a certain period of inactivity (e.g., 30 minutes).

5. Regularly Regenerate Session IDs

Change the session ID frequently, especially after important events like login.

  • How it works: After a successful login, create a new session ID and invalidate the old one. This limits the impact of a stolen cookie.

6. Consider Using Tokens (JWTs)

JSON Web Tokens (JWTs) are a more secure alternative to cookies for some applications.

  • How it works: The server creates a signed token containing user information and sends it to the client. The client stores the token (e.g., in local storage) and includes it with each request.
  • Benefits: JWTs are stateless, making them easier to scale. They can also be used across multiple domains.
Related posts
Cyber Security

Zip Codes & PII: Are They Personal Data?

Cyber Security

Zero-Day Vulnerabilities: User Defence Guide

Cyber Security

Zero Knowledge Voting with Trusted Server

Cyber Security

ZeroNet: 51% Attack Risks & Mitigation