DEV Community

Dealing with Chrome SameSite cookie attribute in Shopify Apps made with PHP/Laravel

Zubair Mohsin on February 13, 2020

Prerequisite Read this extensive tutorial from Shopify to get more understanding about the SameSite cookie attribute. Working with Same...
Collapse
 
rowan_m profile image
Rowan Merewood •

Nice article! For the benefit of anyone reading who didn't take your advice and fully understand the issues first ;) Please, please, please remember you ONLY need SameSite=None; Secure for cookies that are sent in cross-site / third-party contexts. So, that means these embedded apps or services. Cookies for first-party use, i.e. the domain in the browser matches the domain of the cookie, then consider SameSite=Lax or SameSite=Strict instead. Do not just blindly add SameSite=None; Secure to every single cookie.

Collapse
 
jasperf profile image
Jasper Frumau •

So for the Laravel session and XSRF Token cookies we should use SameSite="Strict at config/session.php? How would we implement this and only have this apply for these two cookies I am now getting warnings for?

cookie `host-name_staging_session` will be soon rejected because it has
 the “sameSite” attribute set to “none” or an invalid value, without the “secure” attribute. To know more about the “sameSite“ attribute, read
 https://developer.mozilla.org/docs/Web/HTTP/Headers/Set-Cookie/SameSite 1748
Collapse
 
rowan_m profile image
Rowan Merewood •

I'd suggest Lax for your session cookie, not Strict.

Collapse
 
dasdaniel profile image
Daniel P 🇨🇦 • • Edited

Very timely post :) Just wanted to note some of my findings.

Chrome 80, as it's being updated across our computers, likely does not break your site/app.

Due to the safari bug, they put in an exception

Chrome will make an exception for cookies set without a SameSite attribute less than 2 minutes ago.

(link: chromestatus.com/feature/508814734...)

However, Safari seems to have been broken for a while now, so a fix should be implemented quickly.

(link: bugs.webkit.org/show_bug.cgi?id=19...)

Their solution uses an Apache regex to solve the problem, but the solution is not up to date with latest Safari.

On a side note, if you've using an SPA and JWTs (no cookies) this is a non-issue.

Collapse
 
rowan_m profile image
Rowan Merewood •

That exception is temporary and will go away at some point. The specific situation that covers is for top-level, cross-site POST requests that require cookies. These should be set with SameSite=None; Secure as a permanent fix, not rely on the exception. This was added to account for a number of individual single sign-on implementations using this pattern to receive a CSRF token in their cookie - it is not related to the Safari issue.

The Safari issue is due to their implementation matching a much earlier version of the draft. As a result, if you need the cookie to work in all browsers you can use the double cookie solution proposed in web.dev/samesite-cookie-recipes/#h...

Collapse
 
zubairmohsin33 profile image
Zubair Mohsin •

Thank you Rowan for your input on this issue 🙏🏼

Collapse
 
zubairmohsin33 profile image
Zubair Mohsin •

Hi Daniel, thank you for sharing your findings.

SameSite flag is not being enforced even in Chrome 80 until 17th February, 2020. ( I am not sure about the date ) as a relaxation.

If you want to test, go to chrome://flags and enable all three SameSite flags. You will see the errors mentioned in Shopify's tutorial.

All we can do, is to be prepared, right? ;)

And yeah, you are right about SPA. 👍

Let me know your thoughts! Thanks.

Collapse
 
orrd profile image
David Orr •

Why is it necessary to check the browser and only set the SameSite/Secure attributes for compatible clients? Would something bad happen if you just set it in your config/session.php and used it for all users? Any clients that do not recognize SameSite=None should ignore it and carry on as if the attribute was not set.

Collapse
 
wajahatanwar profile image
Wajahat Anwar •

One more thing I discovered. We can't set SameSite = None in laravel 5.6 or lower version. SameSite = Lax works in laravel 5.6 But we can set SameSite = NONE in 5.8 or above.

Collapse
 
wajahatanwar profile image
Wajahat Anwar •

This tutorial was super helpful and it is straight and to the point. Thanks, Mohsin for sharing this.

Collapse
 
jayshopto profile image
jayShopTO •

Thank you for making this and helping the community.