Autentifikacijos planas — sesijos, ne JWT; bcrypt
Programa turi users lentelę su password_hash stulpeliu, kurio kol kas niekas neužpildo. Ši pamoka pradeda autentifikacijos fazę: iki pabaigos kažkas galės užsiregistruoti, o serveris jį prisimins tarp užklausų. Tai dvi problemos — saugiai išsaugoti slaptažodį ir prisiminti, kas prisijungęs — ir kiekviena turi apgalvotą atsakymą.
Slaptažodžiai: bcrypt, cost 12. Slaptažodžio niekada nesaugai; saugai vienpusę maišą. Naudojam bcrypt (golang.org/x/crypto/bcrypt) su cost 12 (~250ms vienai maišai — sąmoningai lėtai, kad brute force būtų brangus). Kodėl bcrypt, o ne argon2id? Mokomajam kodui jo paviršius mažesnis ir sunkiau supainiojamas: viena reguliavimo rankenėlė vietoj trijų, o cost įrašytas pačioje maišos eilutėje. Kompromisas sąžiningai įvardytas kode — argon2id yra OWASP pirmas pasirinkimas naujoms sistemoms, o bcrypt tyliai nukerpa įvestį virš 72 baitų. Šitą paskutinį nukenksminam apribodami slaptažodžio ilgį iki 64, tad niekada nieko tyliai neprarandam. (Niekada netyčia neapribok žemiau nukirpimo taško — 72 yra skardis, 64 yra tvora prieš jį.)
Prisiminti, kas prisijungęs: serverio pusės sesija — NE JWT. Tai sąmoningas priešpriešinis taškas Pica mobiliajai programai, o 14 pamoka ir yra visas argumentas. Forma:
- Naršyklė laiko vieną dalyką: neskaitomą atsitiktinį žetoną slapuke. Jokių teiginių, jokio vartotojo ID, nieko skaitomo.
- Tikra sesija gyvena
sessionseilutėje Postgres. - Saugom tik žetono SHA-256 maišą, niekada patį žetoną — tas pats triukas kaip su slaptažodžiu. Duomenų bazės nuotėkis nepaduoda įsilaužėliui jokių veikiančių sesijų.
- Slapukas yra
HttpOnly(JavaScript jo neperskaitys → XSS klaida jo nepavogs),SameSite=Lax(nesiunčiamas su kryžminiais POST → bazinė CSRF apsauga) irSecureprodukcijoje (tik HTTPS).
Didžiausia pasekmė — ir tai, ko JWT negali — kad atsijungimas yra vienas DELETE. Kadangi sesija yra mūsų valdoma būsena, ją galim akimirksniu atšaukti. Tai pastatysi 5 pamokoje.
Ši pamoka:
auth/password.go(bcrypt),sessionslentelė + jos užklausos irsession.Manager.- Registracijos forma ir apdorotojas, sujungti nuo pradžios iki galo.
Iki pabaigos: užsiregistruoji tikra paskyra ir matai sesijos slapuką su vėliavomis — ir sessions eilutę, saugančią tik maišą.
Pastaba — CSRF ateina, sąmoningai. Šios pirmos formos POST'ina be CSRF apsaugos. Tai tyčia: 6 pamoka prideda
gorilla/csrf, ir pamatysi, kaip ji atmeta būtent šią formą su glumina klaida, prieš sužinant, ką CSRF iš tikro gina. Pirma pajusk programą veikiant; antra — apšarvuok.