GDPR: Důvěryhodné předávání údajů pomocí odkazů
Nasazování GDPR s sebou přineslo, mimo jiné, i rozšíření počtu e-mailů, ve kterých uživatele žádáme o potvrzení jeho akce (přihlášení k odběru novinek, registrace atp.). Dříve takových e-mailů bylo jen pár, např. žádost o ohodnocení produktu nebo obnovení hesla. Nově to jsou všechny dvojité souhlasy.
Nejde o GDPR, jde o uživatele
Tzv. “double opt-in” ověření vykonané akce však nečinní za dost pouze GDPR. Jde o vhodný způsob ověření bez ohledu na legislativu. Domníváme se totiž, že i obyčejné potvrzení souhlasu s odběrem newsletteru si zaslouží, aby bylo prokazatelné, uživatel byl chráněn a riziko cíleného zneužití URL bylo minimální.
Jak jsme zvolili technické řešení?
Pro ověřování předávaných údajů jsme využili poměrně nový standard výměny dat JSON Web Token (JWT) popsaný v samostatném RFC 7519. Na přehledných stránkách projektu se dočtete, co všechno zmíněný standard popisuje a jak kýženého výsledku dosahuje. Kromě toho na webu najdete i on-line nástroj pro kontrolu vygenerovaných JWT tokenů nebo filtrovatelný přehled implementací JWT knihoven pro různé programovací jazyky.
“double opt-in” - ověření vykonané akce
Co je to JSON Web Token
JWT je standard, který definuje, jak předávat data mezi dvěma systémy s ověřením, že při jejich přenosu nedošlo ke změně - jsou tzv. digitálně podepsaná (JWT data nešifruje). Převod dat probíhá jednoduše. Potřebná data se podepíšou pomocí zvoleného algoritmu (algoritmy jsou součástí knihoven, stačí vybrat), vytvoří se hlavička zprávy s parametry podepisujícího algoritmu a spojí se se samotnými daty a podpisem dat.
Vše tvoří ve výsledku jeden řetězec. Délka hlavičky i podpisu je neměnná vzhledem k délce zprávy, mění se jen délka těla zprávy. Výsledná zpráva je zakódována do Base64, aby nedošlo k rozbití zprávy při přenosu vlivem špatného kódování apod.
Chcete-li si tak přenést e-mailovou adresu pro potvrzení odběru newsletteru, budete zřejmě potřebovat poslat v potvrzovací URL parametry “email=karel@novak.cz”.
Při použití JWT pošlete:
“token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImthcmVsQG5vdmFrLmN6In0.
o0gDqK309YaFdZSI4RF1HzUdZYln7o5GUeui-enHjoST4l-EhgkMszkYZ0snYjNpsqVyIxz7l0WWN_9nvJZsrQ”.
Na první pohled je odkaz znatelně delší. V těle e-mailu je odkaz ovšem schovaný za tlačítko vyzývající k akci, takže uživatel tvar URL neuvidí.
Přihlášení k newsletteru
Po přijetí takového požadavku budete vědět, že odkaz byl vygenerován ve vašem systému.
Výhody JWT v praxi
Standard JWT obsahuje několik variant, kterými je možné povahu tokenu upravit. Např. vám dovolí stanovit platnost tokenu, do kdy je maximálně validní. Generujete-li odkazy pro změnu hesla, je žádoucí mít odkaz platný jen omezený čas, aby se snížila doba k provedení útoku.
Do teď jsme si k uživateli ukládali náhodně vygenerovaný token a datum platnosti tokenu. S nasazením JWT je délka platnosti tokenu už uložená přímo v něm. Mimo jiné nám odpadlo generování náhodného tokenu do databáze a s tím spojená režie (mazání starých tokenů, nutnost mít index nad dalším sloupcem atd.) Stačí už jen logovat, že došlo k žádosti.
Dále si pohráváme s myšlenkou, že by převod na podepsaný token prováděl už automaticky router v aplikaci. O tom možná příště.
Nasazení JWT do našeho řešení od kolegy Marka si můžete prohlédnout v repozitáři na GitHubu.
Sdílet na facebooku anebo twitteru