JsonWebToken, express JS och cookies...

Permalänk

JsonWebToken, express JS och cookies...

Håller på att göra en hemsida och vill förvara lite information om användaren i en cookie eller liknande, så att det är lätt att verifiera om användaren har tillgång till vissa routes osv. Är det här ett säkert sätt att göra det?

let jwtInfo = { _id: user._id, adminLevel: user.adminLevel, isBanned: user.isBanned }; let jwtString = jwt.sign(jwtInfo, process.env.SECRET); res.cookie("userDetails", jwtString, { maxAge: (1000 * 60 * 60 * 24 * 30), sameSite: "lax" })

koden är ganska självförklarande, men jag sparar användarens id, adminLevel och isBanned i en signad JWT string, som är signad med en secret key. Sedan så sparar jag den här informationen i en cookie som lever i 30 dagar, och har sameSite protokollet på lax, som tydligen ska vara väldigt säkert.
Iochmed att JWT stringen är signad med en secret, så ska det inte gå att modifiera den utan att back-enden känner av det va? Det är ju lätt att decrypta en JWT string dock, så jag har ingen sensative information som lösenord där. Men är det här ett säkert sätt att göra saker, eller hade det varit lätt för en användare att hacka det här, och typ komma åt admin sidor osv?

Visa signatur

We all got a chicken-duck-woman-thing waiting for us

CPU: Intel Core i7 10700K
GPU: Nvidia GTX 1080
RAM: DDR4 16 GB

Permalänk
Medlem

Varför inte bara kolla adminlevel vid anrop? Vad händer när den får en annan level not det som finns i cookie

Visa signatur

Arch - Makepkg, not war -||- Gigabyte X570 Aorus Master -||- GSkill 64GiB DDR4 14-14-15-35-1T 3600Mhz -||- AMD 5900x-||- Gigabyte RX6900XT -||- 2x Adata XPG sx8200 Pro 1TB -||- EVGA G2 750W -||- Corsair 570x -||- O2+ODAC-||- Sennheiser HD-650 -|| Boycott EA,2K,Activision,Ubisoft,WB,EGS
Arch Linux, one hell of a distribution.

Permalänk
Medlem

Jag hade nog hellre skapat en GUID eller liknande vid varje inlogg som sedan måste skickas med i anropen för att verifieras i backend. Denna GUID byts ut vid varje inloggning/tas bort vid utloggning så den inte kan återanvändas.

Utan att logga in så får du ingen GUID och kan därmed inte fortsätta, det är även med denna (som du såklart sparar i någon databas) som du får ut vem användaren är m.m.

- sen är det säkert inte det bästa sättet, men känns lite bättre än att i alla fall lagra det i en cookie och blint lita på vad den säger att man har för roll m.m

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem

Det ska nog vara säkert att lagra din jwt-sträng i en cookie.

Du måste ha en bra secret, dock. Annars finns risken att någon kan cracka den, antingen med brute force eller en rainbow table.

Sedan måste du självklart också alltid verifiera den innan du använder den.

Det kan även löna sig att kolla på hur du skydder dig mot XSS och CSRF, men det har inte direkt med jwt att göra.

Permalänk
Medlem

Man brukar reglera det där med vad som kallas scope, kika lite på det

Permalänk
Medlem
Skrivet av Pamudas:

Jag hade nog hellre skapat en GUID eller liknande vid varje inlogg som sedan måste skickas med i anropen för att verifieras i backend. Denna GUID byts ut vid varje inloggning/tas bort vid utloggning så den inte kan återanvändas.

Utan att logga in så får du ingen GUID och kan därmed inte fortsätta, det är även med denna (som du såklart sparar i någon databas) som du får ut vem användaren är m.m.

- sen är det säkert inte det bästa sättet, men känns lite bättre än att i alla fall lagra det i en cookie och blint lita på vad den säger att man har för roll m.m

Man "litar inte blint" på en JWT. man verifierar signeringen. Rätt implementerat (använd uppdaterade jwt-lib) och med kort life-time så finns det inte så mycket att oroa sig för.

Permalänk
Skrivet av Commander:

Varför inte bara kolla adminlevel vid anrop? Vad händer när den får en annan level not det som finns i cookie

Jag studerar fortfarande och är inte ett profs, så korrigera mig om jag har fel. Men man vill väl ändå minimera anrop till sin databas?

Visa signatur

We all got a chicken-duck-woman-thing waiting for us

CPU: Intel Core i7 10700K
GPU: Nvidia GTX 1080
RAM: DDR4 16 GB

Permalänk
Skrivet av Pamudas:

Jag hade nog hellre skapat en GUID eller liknande vid varje inlogg

Det är mycket möjligt att det är det bästa alternativet, men vår lärare vill gärna att vi ska använda JWT till det här. Sidan ska inte faktiskt lanseras, men den ska vara i sådan kvalitet så att vi skulle kunna lansera sidan eller sälja våra tjänster.

Skrivet av Pamudas:

- sen är det säkert inte det bästa sättet, men känns lite bättre än att i alla fall lagra det i en cookie och blint lita på vad den säger att man har för roll m.m

Som jag förstår det så kan vem som helst decrypta en JWT string (och därmed ska inte lösenord osv vara förvarad i den), men det JWT är till för är att se om JWT stringen har blivit tampered med eller om den är riktig sedan när man verifiar den. Som @dlq84 sa

Visa signatur

We all got a chicken-duck-woman-thing waiting for us

CPU: Intel Core i7 10700K
GPU: Nvidia GTX 1080
RAM: DDR4 16 GB

Permalänk
Medlem
Skrivet av MariusFranzen:

Det är mycket möjligt att det är det bästa alternativet, men vår lärare vill gärna att vi ska använda JWT till det här. Sidan ska inte faktiskt lanseras, men den ska vara i sådan kvalitet så att vi skulle kunna lansera sidan eller sälja våra tjänster.

Som jag förstår det så kan vem som helst decrypta en JWT string (och därmed ska inte lösenord osv vara förvarad i den), men det JWT är till för är att se om JWT stringen har blivit tampered med eller om den är riktig sedan när man verifiar den. Som @dlq84 sa

Ah jag förstår
Missuppfattade syftet helt enkelt 👍

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem

jwt funkar bra med stateless servrar, där man kan ha lastdelning mellan flera instanser av en backendserver. Ett traditionellt sessions id har antagligen problem med det scenariot.

Används jwt tokenen till autentisering så brukar jag spara den som en "secure http only" kaka. Då skickas den endast över krypterade anslutningar och är inte tillgänlig för frontendapplikationen. (kakan kommer automatiskt läggas på http anrop mot backenden). Sen skapar jag en restendpoint på t.ex. /me som frontenden t.ex. kan använda för att hämta information i jwt'n

Jag brukar inte trycka in så mycket data i mina jwts men kan säkert vara rimligt i vissa situationer, då främst för att undvika onödiga databasslagningar skulle jag tro. Problemet är väl dock om du kan lita på datan. Kan den t.ex. ha ändrats sedan tokenen genererades?

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | aw3225qf |