Chrome με SameSite Cookies

Με την κυκλοφορία του Chrome 80 τον περασμένο Φεβρουάριο (02/2020), o Chrome εφάρμοσε ένα νέο σύστημα κατάταξης των cookies. Το σύστημα αυτό έχει να κάνει με τον τρόπο που φορτώνονται τα cookies ενός ιστότοπου και το αν θα επιτρέπεται η φόρτωση των cookies και σε άλλους ιστότοπους.

Χρησιμοποιεί το χαρακτηριστικό (attribute) ‘SameSite‘, που ορίζεται στους HTTP Headers και παίρνει τις τιμές ‘Strict‘ (Αυστηρό), ‘Lax‘ (Χαλαρό) και ‘None‘ (Κανένα). Όποια cookies οριστούν σαν ‘Strict’, θα αποστέλλονται εφόσον το site του cookie είναι το ίδιο με το site που πλοηγείτε ο χρήστης (same-site requests). Όποια cookies οριστούν σαν ‘Lax’, θα αποκλείονται από τα cross-site requests, όπως κλήσεις για φόρτωση εικόνων ή frames, αλλά θα αποστέλλονται όταν ένας χρήστης πλοηγηθεί στη διεύθυνση URL από έναν εξωτερικό ιστότοπο, για παράδειγμα, ακολουθώντας έναν σύνδεσμο. Όποια cookies οριστούν σαν ‘None’, θα αποστέλλονται και σε cross-site requests και σε same-site requests.

Το χαρακτηριστικό αυτό, το οποίο έχει σκοπό να αυξήσει την ιδιωτικότητα του χρήστη καθώς πλοηγείται σε ένα ιστότοπο, υπάρχει αρκετά χρόνια και πιο συγκεκριμένα από το 2016, αλλά υιοθετείται πάρα πολύ αργά. Με την έλευση το Chrome 80, η Google αποφάσισε να προωθήσει την υιοθέτηση αυτής της δυνατότητας. Για τον λόγο αυτό, σε όποιο cookie δεν έχει οριστεί ρητά το χαρακτηριστικό ‘SameSite’, ο browser θεωρεί ότι έχει την τιμή ‘Lax’. Το γεγονός αυτό όμως μπορεί να δημιουργήσει πρόβλημα στα sites που χρησιμοποιούν “authentication cookies“.

Για την αποφυγή αυτού του προβλήματος θα πρέπει τα “authentication cookies” να οριστούν ρητά σαν ‘None’, καθώς και σαν ‘Secure’. Να έχουν σαν χαρακτηριστικά δηλαδή τα ‘SameSite=None; Secure‘. Υπάρχει βέβαια ένα πρόβλημα με παλαιότερους browsers, όπως είναι ο Safari για macOS 10.14 Mojave και iOS 12, καθώς και στους Chrome 5x και Chrome 6x. Οι browsers αυτοί δεν αναγνωρίζουν την τιμή ‘None’ οπότε χρησιμοποιούν την τιμή ‘Strict’. Η λύση στο πρόβλημα αυτό είναι όταν πρόκειται για αυτούς τους browsers μην εφαρμόζουμε τα χαρακτηριστικά ‘SameSite=None; Secure’.

Η εφαρμογή των χαρακτηριστικών μπορεί να γίνει μέσω κώδικά ή αν χρησιμοποιείται ο NGINX σαν proxy τότε αυτό μπορεί να γίνει πολύ εύκολα με την παρακάτω ρύθμιση στο αρχείο nginx.conf.

map $http_user_agent $samesite_none {
    default                "; Secure; HttpOnly; SameSite=None";
    "~CPU iPhone OS 12"    "";
    "~iPad; CPU OS 12"     "";
    "~(?=Macintosh; Intel Mac OS X 10_14).*(?=Version).*Safari"	"";
    "~Chrom[^ \/]+\/(?:5|6)[\d][\.\d]*" "";
}

και σε κάθε virtual host

server {
    # Your other server directives...

    location / {
        # Your other location directives...
        
        proxy_cookie_path / /$samesite_none;
    }
}

Μπορείτε να διαβάσετε περισσότερα στα παρακάτω άρθρα

https://blog.chromium.org/2020/02/samesite-cookie-changes-in-february.html

https://www.thinktecture.com/en/identity/samesite/prepare-your-identityserver/

https://www.ubisecure.com/technical-announcements/samesite-cookies-changes/