Same-site cookies are an important security mechanism that can be used to mitigate Cross-Site Request Forgery (CSRF) attacks in web applications. CSRF attacks occur when an attacker tricks a victim into performing an unintended action on a website on which the victim is authenticated. By exploiting the victim's session, the attacker can perform actions on behalf of the victim without their consent.
Same-site cookies help prevent CSRF attacks by restricting the scope of cookies to the same origin. An origin is defined by the combination of the protocol (e.g., HTTP or HTTPS), domain, and port number. When a cookie is set with the "SameSite" attribute, it specifies whether the cookie should be sent in cross-site requests.
There are three possible values for the "SameSite" attribute:
1. "Strict": When the "SameSite" attribute is set to "Strict", the cookie is only sent in requests originating from the same site. This means that the cookie will not be sent in cross-site requests, effectively preventing CSRF attacks. For example, if a user is authenticated on "example.com" and visits a malicious site that tries to perform a CSRF attack, the browser will not include the "Strict" same-site cookie in the request, thus preventing the attack.
2. "Lax": When the "SameSite" attribute is set to "Lax", the cookie is sent in cross-site requests that are considered safe, such as when the request is triggered by a top-level navigation from the user. However, the cookie is not sent in requests that are initiated by third-party websites, such as when an image or script tag is loaded from another domain. This provides a balance between security and usability. For example, a user visiting a malicious site through a link will not trigger a CSRF attack because the "Lax" same-site cookie will not be included in the request.
3. "None": When the "SameSite" attribute is set to "None", the cookie is sent in all cross-site requests, regardless of their origin. However, to ensure the security of using "None", the cookie must also be marked as "Secure", which means it will only be sent over HTTPS connections. This combination allows web applications to support cross-site functionality while still protecting against CSRF attacks. It should be noted that the "None" value should only be used when necessary, as it increases the attack surface and potential for CSRF vulnerabilities.
To illustrate the usage of same-site cookies in mitigating CSRF attacks, consider the following scenario: a banking website that allows users to transfer funds. Without same-site cookies, an attacker could create a malicious website that includes a hidden form that automatically submits a fund transfer request to the banking website when visited by an authenticated user. If the user's browser includes the session cookie in the request, the transfer will be executed without the user's consent. However, by setting the session cookie as a same-site cookie with the "Strict" attribute, the browser will not include the cookie in the cross-site request, effectively preventing the CSRF attack.
Same-site cookies are a valuable security mechanism for mitigating CSRF attacks in web applications. By restricting the scope of cookies to the same origin, these cookies prevent attackers from exploiting a user's session to perform unauthorized actions. The "Strict" value ensures that cookies are only sent in requests originating from the same site, while the "Lax" value allows cookies to be sent in safe cross-site requests. The "None" value, combined with the "Secure" attribute, enables cross-site functionality while still protecting against CSRF attacks.
Other recent questions and answers regarding EITC/IS/WASF Web Applications Security Fundamentals:
- Does implementation of Do Not Track (DNT) in web browsers protect against fingerprinting?
- Does HTTP Strict Transport Security (HSTS) help to protect against protocol downgrade attacks?
- How does the DNS rebinding attack work?
- Do stored XSS attacks occur when a malicious script is included in a request to a web application and then sent back to the user?
- Is the SSL/TLS protocol used to establish an encrypted connection in HTTPS?
- What are fetch metadata request headers and how can they be used to differentiate between same origin and cross-site requests?
- How do trusted types reduce the attack surface of web applications and simplify security reviews?
- What is the purpose of the default policy in trusted types and how can it be used to identify insecure string assignments?
- What is the process for creating a trusted types object using the trusted types API?
- How does the trusted types directive in a content security policy help mitigate DOM-based cross-site scripting (XSS) vulnerabilities?
View more questions and answers in EITC/IS/WASF Web Applications Security Fundamentals

