OAuth (Open Authorization) este un protocol standardizat, utilizat pentru autorizarea securizată a accesului la resursele unei aplicații de către o altă aplicație sau serviciu. Este predecesorul OAuth 1.0, care, spre deosebire de acesta, folosea semnături criptografice în loc de tokenuri și code-uri de acces. De asemenea, este mult mai standardizat, flexibil și ușor de folosit decât versiunea anterioară. Există anumite aspecte în care OAuth 1 oferea un nivel mai mare de securitate comparativ cu prima versiune a OAuth 2.0, dar acest lucru nu înseamnă că OAuth 1.0 este întotdeauna mai sigur.
OAuth a fost conceput inițial pentru a permite utilizatorilor să ofere acces la conturile lor de pe platforme terțe fără a distribui parola. Printre cei mai populari furnizori de astfel de acces sunt Google, Twitter, Facebook, facilitând accesul la sute de site-uri. Bineînțeles, acest lucru vine cu implicații de securitate.
Securitatea este un aspect vital în cadrul protocolului OAuth, deoarece ne asigurăm că datele noastre personale sunt protejate, prevenim accesul neautorizat, evităm atacurile de phishing și Man-in-the-Middle, menținem integritatea și autenticitatea datelor noastre și construim încrederea noastră ca utilizatori.
Mecanismul bazat pe tokenuri de acces ne permite să acordăm accesul aplicațiilor terțe la resursele noastre, cum ar fi profilul sau fotografii, fără a dezvălui parola noastră direct către aceste aplicații. În acest flux, interacțiunea noastră începe prin redirecționarea către serverul de autorizare, unde confirmăm permisiunile solicitate de aplicația terță. După ce acordăm autorizarea, primim un token de acces pe care aplicația terță îl poate utiliza pentru a accesa resursele noastre în numele nostru. Acest flux simplificat și standardizat oferă o modalitate sigură și convenabilă de a gestiona autorizarea și accesul nostru în mediul digital actual.
Entitățile principale în acest flow sunt:
Utilizatorul: persoana ale cărei date vor fi accesate.
Clientul: este aplicația sau serviciul care solicită accesul la resursele protejate. Acesta poate fi, de exemplu, o aplicație web, o aplicație mobilă sau chiar o altă aplicație de server.
Serverul de autorizare: este serverul care autentifică utilizatorul și autorizează accesul clientului la resursele protejate. Acesta verifică identitatea utilizatorului și, după autentificare, emite un token de acces către client.
Serverul resurselor: este serverul care deține resursele protejate la care clientul solicită acces. Acesta verifică validitatea tokenului de acces primit de la client și oferă sau restricționează accesul la resurse, în funcție de autorizare.
Pentru ca utilizatorul să poată oferi acces, acesta trebuie să aibă un cont activ pe platforma furnizorului. Următorul pas e ca aplicația client să fie înregistrată la furnizor cu niște credențiale pereche, client_id și client_secret. Acestea vor fi unice, iar secretul nu va fi distribuit altor aplicații. Unii dintre primii pași care pot crește securitatea e verificarea tuturor aplicațiilor client care vor să se înregistreze pentru a verifica legitimitatea acestora.
În cadrul protocolului OAuth, tipurile de tokenuri sunt:
Authorization Code (Cod de autorizare): Acesta este un cod unic generat de serverul de autorizare în urma autentificării cu succes a utilizatorului. Aplicația client primește acest cod și îl folosește pentru a obține un token de acces.
Access token (Token de acces): Este un token care este emis de serverul de autorizare după schimbul codului de autorizare. Acest token este utilizat de către aplicația client pentru a accesa și obține resurse de la serverul resurselor.
Refresh token (Token de reîmprospătare): Acesta este un token opțional care este emis împreună cu token-ul de acces. Refresh tokenul este utilizat pentru a obține un nou token de acces atunci când acesta expiră.
De asemenea, access token și ID token pot fi folosite împreună, încapsulate într-un token de tipul JWT care conține și identitatea utilizatorului și accesul la diferite resurse.
Ca bună practică, codul de autorizare nu conține date despre utilizator, identificare sau altele, ci este un cod generat. Acesta este transmis la frontend, spre deosebire de codul de acces sau ID care poate rămâne secret.
Altfel, codul ar putea fi furat printr-un atac de tipul Man-In-the-middle
În figura de mai jos este demonstrat un flow OAuth 2.0 obișnuit.
Furtul sesiunii: redirectarea la pagina de autorizare poate fi făcută de către o aplicație străină care copiază identificatorul aplicației client și modifică scope-ul sau redirect_url -ul tocmai în scopul de a primi codul de autorizare și de a accesa resursele. Serverul de autorizare poate valida datele clientului pentru a se asigura că nu generează coduri pentru utilizatori inexistenți.
Validare insuficientă: codul de autorizare trebuie salvat și apoi validat împreună cu credențialele clientului. Un pas în plus e validarea tuturor datelor cu care codul de autorizare a fost generat(redirect_url, scope).
Transmiterea datelor prin canale securizate: pentru a preveni atacuri de tip MITM, comunicarea între entități se face prin HTTPS. De asemenea, requesturile între servere sunt greu de interceptat, în comparație cu cele de frontend.
Expunerea secretelor: Configurarea sau implementarea incorectă a protocolului OAuth poate duce la expunerea accidentală a cheilor de client sau a cheilor secrete de semnare, facilitând accesul neautorizat la resursele protejate.
Autorizare insuficientă: Configurarea greșită a fluxului de autorizare poate duce la acordarea permisiunilor excesive sau insuficiente, creând riscul de acces neautorizat sau restricționarea inadecvată a resurselor protejate.
Probleme de autentificare: Implementarea incorectă a procesului de autentificare în OAuth poate duce la vulnerabilități precum autentificare slabă, atacuri brute sau furt de identitate.
JWT (JSON Web Token) este un standard deschis utilizat pentru transmiterea securizată a informațiilor între părți în format JSON. Este un format compact și autodescriptiv care poate fi utilizat pentru reprezentarea și transmiterea datelor într-un mod sigur și verificabil. Un JWT constă din trei părți separate de puncte: antet (header), corp (payload) și semnătură.
Antet: Conține informații despre tipul tokenului și algoritmul de semnare utilizat pentru a genera semnătura. Nu conține date despre utilizator. Pot fi folosiți algoritmi cunoscuți precum HMAC, RSA sau unii personalizați.
Corp: Conține informațiile utile și semnificative transportate în JWT. Aceste informații pot fi orice perechi cheie-valoare, cum ar fi ID-ul utilizatorului, rolurile sau permisiunile acestuia, informații despre sesiune sau alte atribute relevante. Payload-ul este encodat în format JSON și poate fi citit de către orice parte care primește JWT-ul.
Unul dintre primii pași care pot fi urmați pentru a crește securitatea unei aplicații care folosește JWT e de a avea mai multe chei de criptare. Astfel, chiar dacă una dintre chei devine compromisă, impactul este minim. De exemplu, o aplicație cu 20.000 de utilizatori, care folosește 100 de chei de criptare e mai sigură pentru că, dacă una dintre chei devine publică, sunt afectați numai ~200 de utilizatori. În acest caz, tokenul trebuie să conțină în antet și identificatorul cheii.
Una dintre limitările JWT-ului este că, dacă se transmit prea multe date despre utilizator cum ar fi roluri, permisiuni, resurse disponibile, tokenul poate deveni prea mare și poate ocupa prea mult spațiu. De obicei, acesta se transmite în request headers, care, pentru unele servere, pot avea maxim 4KB. Trebuie să luăm în considerare și faptul că acest token este în format JSON, adică deține și delimitatori, iar când corpul crește, și semnătura crește.
În final, securitatea este un aspect crucial în implementarea și utilizarea protocolului OAuth. Prin mecanismele sale de securitate, cum ar fi utilizarea canalelor securizate, tokenurile de acces, semnăturile digitale și codurile de autorizare unice, OAuth oferă o soluție robustă pentru protejarea autentificării și autorizării în aplicații și servicii. Este important să acordăm atenție implementării corecte a protocoalelor și să urmăm bunele practici de securitate pentru a asigura un nivel adecvat de protecție.
de Alex Popescu
de Peter Leeson
de Denisa Lupu