ბიბლიოთეკა
00/07 · ~36 წთ
GUIDEDECK · სწორი ადამიანების შემოსაშვებად

ავთენტიფიკაცია
& ავტორიზაცია
როგორც საჭიროა.

36-წუთიანი სამუშაო სესია იმაზე, როგორ დაამტკიცოთ, ვინ არის მომხმარებელი, და როგორ გადაწყვიტოთ, რისი უფლება აქვს — პაროლების ჰეშირებიდან და სესიები vs ტოკენებიდან, OAuth 2.0-სა და OpenID Connect-ის გავლით, RBAC-მდე, სტანდარტებამდე და იმ ინსტრუმენტებამდე, რომლებიც მათ ახორციელებს.

~36 წთდამწყები → საშუალოენისგან დამოუკიდებელი
გადაახვიეთ
01 · ორი სხვადასხვა კითხვა 4 წთ

ვინ ხართ? იგივე არ არის, რაც რისი უფლება გაქვთ?

უსაფრთხოების თითქმის ყველა ბაგი ამ ორის აღრევით იწყება. ისინი მკაცრი თანმიმდევრობით მუშაობს: სისტემა ჯერ ადგენს ვინაობას და მხოლოდ შემდეგ ამოწმებს უფლებას. სწორად აითვისეთ თანმიმდევრობა — და სიტყვებიც — და ამ სესიის დანარჩენი ნაწილი ადგილზე დაჯდება.

ავთენტიფიკაცია (AuthN) — იმის დამტკიცება, რომ ის ხართ, ვინც ამბობთ, რომ ხართ. ის პასუხობს კითხვას ვინ ხართ? — რაღაცით, რაც იცით (პაროლი), რაღაცით, რაც გაქვთ (ტელეფონი, passkey), ან რაღაცით, რაც ხართ (თითის ანაბეჭდი). ავტორიზაცია (AuthZ) — იმის გადაწყვეტა, რის უფლება აქვს ვინაობას. ის პასუხობს კითხვას გაქვთ ამის უფლება? და ყოველთვის ავთენტიფიკაციის შემდეგ ხდება.

ჯერ ვინაობა, მერე უფლება. ვინაობის ჩავარდნილი შემოწმება აბრუნებს 401 Unauthorized-ს; უფლების ჩავარდნილი შემოწმება — 403 Forbidden-ს.

აეროპორტის ანალოგია

  • პასპორტის კონტროლი ადასტურებს, ვინ ხართ — ეს ავთენტიფიკაციაა.
  • თქვენი ბორტზე ასვლის ბარათი ამბობს, რომელ რეისზე და რომელ ადგილზე შეგიძლიათ დაჯდეთ — ეს ავტორიზაციაა.
  • ვალიდური პასპორტი აეროპორტში შეგიყვანთ; მაგრამ პირველ კლასში დაჯდომის უფლებას არ გაძლევთ. სხვადასხვა შემოწმება, სხვადასხვა ჩავარდნა.

სახელდების შენიშვნა  HTTP-ის 401 სტატუსს პირდაპირ "Unauthorized" ჰქვია, მაგრამ სინამდვილეში ნიშნავს არაავთენტიფიცირებულს — ისტორიული თავისებურება, რომელიც ღირს იცოდეთ.

ავთენტიფიკაციის სამი ფაქტორი

ცოდნა

რაღაც, რაც იცით

პაროლი, PIN-კოდი ან აღდგენის ფრაზა. იაფი და უნივერსალური — მაგრამ ხელახლა გამოსაყენებელი, ფიშინგით მოსაპარი და გამოსაცნობი. არასოდეს იყოს ერთადერთი ფაქტორი იქ, სადაც რამე მნიშვნელოვანია.

ფლობა

რაღაც, რაც გაქვთ

ტელეფონი ავთენტიფიკატორის აპლიკაციით, აპარატურული უსაფრთხოების გასაღები ან passkey თქვენს მოწყობილობაზე. მოპარული პაროლი მარტო აღარ ჰყოფნის შემტევს შესასვლელად.

თვისება

რაღაც, რაც ხართ

თითის ანაბეჭდი ან სახის სკანი. მოსახერხებელია და ძნელად გასაზიარებელი — მაგრამ სახეს ვერ შეიცვლით, თუ შაბლონი გაჟონავს, ამიტომ ბიომეტრიას მოეპყარით როგორც ლოკალურ განბლოკვას და არა სერვერის საიდუმლოს.

მრავალფაქტორიანი ავთენტიფიკაცია (MFA) უბრალოდ ნიშნავს, რომ ამათგან ორი სხვადასხვა კატეგორიიდან მოითხოვება — ჩვეულებრივ პაროლი პლუს ტელეფონი ან passkey. ეს ყველაზე დიდი ეფექტის მომტანი ერთი კონტროლია, რომელიც შესვლის პროცესს შეგიძლიათ დაუმატოთ.

02 · პაროლები სწორად 5 წთ

არასოდეს შეინახოთ პაროლი.
შეინახეთ მტკიცებულება, რომ ნახეთ ის.

გატეხვა თუ-ს საკითხი არაა, არამედ როდის-ის. ერთადერთი კითხვაა, რას იპოვის შემტევი თქვენს მონაცემთა ბაზაში. შეინახეთ პაროლები სწორად და სრული დამპი მათთვის თითქმის უსარგებლო იქნება. ეს ის შეცდომაა, რომელსაც გუნდები ყველაზე ხშირად — და ყველაზე მტკივნეულად — უშვებენ.

ჰეშირება — შემავალი მონაცემის გატარება ცალმხრივ ფუნქციაში, რომელიც ნებისმიერ პაროლს ფიქსირებული სიგრძის ანაბეჭდად აქცევს და უკან ვერ დააბრუნებთ. შესვლისას აჰეშირებთ იმას, რაც მომხმარებელმა აკრიფა, და ანაბეჭდებს ადარებთ — ასე ამოწმებთ პაროლს ისე, რომ არასოდეს ინახავთ მას. ეს არ არის დაშიფვრა: განზრახ არ არსებობს გასაღები, რომ უკან გაშიფროთ.
რის პოვნაც შემტევებს უყვართ
// plaintext — one breach and every account is gone id | email | password 1 | dani@work.io | Summer2024! // or fast hashes — cracked in minutes on a GPU sha256("Summer2024!") // no salt, billions/sec md5("Summer2024!") // broken — never use
რაც უნდა იპოვონ
// a slow, salted hash — one row, one column id | email | password_hash 1 | dani@work.io | $argon2id$v=19$m=65536,t=3,p=4$ | c29tZXNhbHQ$R7x...k9Q // the algorithm, cost, salt & hash live together
Salt — უნიკალური შემთხვევითი მნიშვნელობა, რომელიც ყოველ პაროლს ემატება ჰეშირებამდე. რადგან ყველა მომხმარებელს სხვა salt აქვს, ერთი და იმავე პაროლის მქონე ორი ადამიანი სხვადასხვა ჰეშს იღებს და შემტევი ვერ მოამზადებს წინასწარ გიგანტურ ცხრილს (rainbow table), რომ ყველა ერთდროულად გატეხოს. salt ჰეშის გვერდით ინახება — ის საიდუმლო არაა, უბრალოდ მასობრივი გატეხვის საწინააღმდეგო საშუალებაა.
import { hash, verify } from "argon2"

// on sign-up: salt is generated & embedded for you
const stored = await hash(plaintext)

// on login: re-hash the attempt & compare safely
const ok = await verify(stored, attempt)
if (!ok) throw new Error("invalid credentials")

პაროლი + უნიკალური salt → ნელი ცალმხრივი ჰეში → შეინახეთ მთელი სტრიქონი. კარგი ბიბლიოთეკა სამივე ნაბიჯს თქვენ მაგივრად აკეთებს.

რომელი ალგორითმი?

argon2id

დღევანდელი ნაგულისხმევი

Password Hashing Competition-ის გამარჯვებული; რეგულირდება მეხსიერებითაც და დროითაც, რაც GPU-სა და ASIC-ით გატეხვას უძლებს. რეკომენდებული პირველი არჩევანი ახალი სისტემებისთვის.

bcrypt

ნაცადი მუშა ცხენი

ათწლეულების გამოცდილება რეალურ ბრძოლაში და ხელმისაწვდომია ყველგან. დღესაც სავსებით კარგია; გაითვალისწინეთ ~72-ბაიტიანი შემავალი ლიმიტი. უსაფრთხო, მოსაწყენი არჩევანი.

scrypt / PBKDF2

მისაღები სათადარიგო ვარიანტები

გამოიყენეთ, როცა მარეგულირებელი მოთხოვნა ავალდებულებს. PBKDF2-ს ნელი რომ დარჩეს, იტერაციების დიდი რაოდენობა სჭირდება — მთელი აზრი სწორედ ის არის, რომ განზრახ ნელი იყოს.

დაუთმობელი წესები (OWASP-ის შესაბამისად)

  • არასოდეს შეინახოთ პაროლი ღია ტექსტად და არასოდეს გამოიყენოთ სწრაფი ჰეშები (MD5, SHA-1, SHA-256) პაროლებისთვის — ისინი სისწრაფისთვისაა აგებული, რაც აქ ზუსტად საწინააღმდეგოა.
  • ჰეშები შეადარეთ მუდმივი დროის შემოწმებით (ბიბლიოთეკის verify), არასოდეს უბრალო ==-ით, რომ დროითი გაჟონვა აირიდოთ.
  • დააბრუნეთ ერთი და იგივე შეცდომა შემთხვევებზე "ასეთი მომხმარებელი არ არსებობს" და "პაროლი არასწორია", რომ არ გაამხილოთ, რომელი ელფოსტებია დარეგისტრირებული.
  • დაამატეთ სიხშირის ლიმიტი და MFA შესვლაზე; ახალი პაროლები შეამოწმეთ გაჟონილი პაროლების სიებთან, ნაცვლად იმისა, რომ უცნაური სიმბოლოების წესები მოითხოვოთ.
03 · როგორ რჩებით შესული 6 წთ

შესვლის შემდეგ შემდეგმა მოთხოვნამ
როგორ უნდა დაგიმახსოვროთ?

HTTP უმდგომარეობოა — ყოველი მოთხოვნა უცნობივით მოდის. ამიტომ წარმატებული შესვლის შემდეგ ბრაუზერს ვაძლევთ რაღაცას, რასაც ის ყოველ მომდევნო მოთხოვნაზე წარადგენს. ორი დომინანტი მიდგომა არსებობს და მათ შორის კომპრომისი მთელ თქვენს არქიტექტურას განსაზღვრავს.

სერვერის სესია — სერვერი ინახავს შესვლის მდგომარეობას და ბრაუზერს მხოლოდ გაუმჭვირვალე ID-ს აძლევს (ქუქიში). ტოკენი (JWT) — სერვერი კლიენტს აძლევს ხელმოწერილ, თვითკმარ საიდენტიფიკაციო მონაცემს, რომელიც მომხმარებლის ვინაობასა და claims-ებს ატარებს, და თავად არაფერს ინახავს. ერთი ძებნას ენდობა, მეორე — ხელმოწერას.
სესია — მდგომარეობა სერვერზე

ქუქი უაზრო ID-ია; სიმართლე იმ საცავშია, რომელსაც სერვერი აკონტროლებს — ამიტომ მომხმარებლის გამოყვანა ერთი წაშლაა.

ტოკენი — მდგომარეობა კლიენტში

ტოკენი თავის claims-ებს თავად ატარებს; სერვერი მხოლოდ ხელმოწერას ამოწმებს — სწრაფია და უმდგომარეობო, მაგრამ გაცემულს უკან ვეღარ წაიღებთ.

JWT-ის ანატომია

  • Header — ალგორითმი და ტოკენის ტიპი.
  • Payload — claims-ები: ვინ არის მომხმარებელი (sub), როდის იწურება ვადა (exp) და როლები თუ scope-ები.
  • Signature — მტკიცებულება, რომ ის სერვერმა გასცა და არავის შეუცვლია.
  • წაიკითხეთ: payload მხოლოდ Base64-ითაა კოდირებული და არა დაშიფრული — ნებისმიერს შეუძლია გაშიფროს, ამიტომ იქ საიდუმლოებს არასოდეს ჩადოთ.
// სამი Base64 ნაწილი, წერტილებით შეერთებული eyJhbGciOiJIUzI1NiJ9 // header .eyJzdWIiOiI3IiwiZXhwIjoxNz...} // payload .R7xK9Q...signature // ხელმოწერა // გაშიფრული payload (claims-ები): { "sub": "7", "role": "editor", "exp": 1717999999 }

JWT არის header.payload.signature. შეცვალეთ payload-ის ერთი ბაიტი და ხელმოწერა აღარ დაემთხვევა.

აირჩიეთ მოდელი გაცნობიერებულად

სესია იგებს

მყისიერი გამოსვლა

გაუქმება საცავში ერთი წაშლაა. იდეალურია კლასიკური ვებ-აპლიკაციებისთვის, ბანკინგისთვის და ყველაფრისთვის, სადაც "ეს მოწყობილობა ახლავე გამოაგდე" მყისიერი უნდა იყოს.

ტოკენი იგებს

მასშტაბი & ბევრი სერვისი

საერთო სესიების საცავი არ არის; ნებისმიერ სერვისს მოთხოვნის შემოწმება მხოლოდ საჯარო გასაღებით შეუძლია. შესანიშნავია API-ებისთვის, მობილურისთვის და მიკროსერვისებისთვის.

ხაფანგი

ტოკენების გაუქმება რთულია

გაჟონილი JWT ვადის გასვლამდე ვალიდურია. გამოსავალი: access-ტოკენები ხანმოკლე გახადეთ (წუთები) და დაუწყვილეთ შენახული, გასაუქმებელი refresh-ტოკენი.

სად ინახავთ, უფრო მნიშვნელოვანია, ვიდრე რომელს აირჩევთ. უპირატესობა მიანიჭეთ HttpOnly, Secure, SameSite ქუქის, რომ JavaScript-მა ვერ წაიკითხოს (ეს XSS-ით ტოკენის მოპარვისგან იცავს). JWT-ის localStorage-ში ჩადება კლასიკური შეცდომაა — ნებისმიერ ჩანერგილ სკრიპტს მისი მოპარვა შეუძლია.

04 · დელეგირებული წვდომა და შესვლა 6 წთ

"შედით Google-ით" — ისე, რომ
Google თქვენს პაროლს არასოდეს გაუზიარებს.

OAuth და OIDC საშიშად ჟღერს, მაგრამ ძირითადი იდეა მარტივია: მომხმარებელს საშუალებას აძლევს, ერთ აპლიკაციას მისცეს შეზღუდული წვდომა მეორეში არსებულ თავის ანგარიშზე — პაროლის ნაცვლად დროებითი გასაღებით. როგორც კი ოთხ როლს დაინახავთ, ნაკადი წინადადებასავით წაიკითხება.

OAuth 2.0 — დელეგირებული ავტორიზაციის სტანდარტი: აპლიკაციას აძლევს შესაძლებლობას, მიიღოს შეზღუდული access-ტოკენი და მომხმარებლის სახელით იმოქმედოს ისე, რომ მისი პაროლი არასოდეს ნახოს. OpenID Connect (OIDC) — ვინაობის თხელი შრე OAuth 2.0-ის თავზე, რომელიც ამატებს ID-ტოკენს და პასუხობს კითხვას "ვინ არის ეს მომხმარებელი?". OAuth წვდომაზეა; OIDC — შესვლაზე.

ოთხი როლი

რესურსის მფლობელი

თქვენ

მომხმარებელი, რომელსაც ანგარიში ეკუთვნის და რომელიც წვდომას გასცემს.

კლიენტი

აპლიკაცია

აპლიკაცია, რომელსაც წვდომა სურს — მაგალითად, ფოტოების ბეჭდვის საიტი.

ავტორიზაციის სერვერი

გამცემი

შეჰყავს მომხმარებელი და გასცემს ტოკენებს — მაგალითად, Google-ის შესვლა.

რესურსის სერვერი

API

ინახავს მონაცემებს და იღებს access-ტოკენს — მაგალითად, Google Photos API.

Authorization Code-ის ნაკადი: აპლიკაცია პაროლს ვერასოდეს ხედავს — მხოლოდ ხანმოკლე კოდს, რომელსაც (თავის საიდუმლოსთან ერთად) ტოკენებზე ცვლის.

წაიკითხეთ ნაკადი

  • მომხმარებელი აჭერს "შედით Google-ით" და გადამისამართდება Google-ზე მოთხოვნილი scope-ების სიით.
  • მომხმარებელი ავთენტიფიკაციას გადის და თანხმობას აძლევს თავად Google-ის გვერდზე; Google აპლიკაციას უგზავნის ერთჯერად authorization code-ს.
  • აპლიკაცია ამ კოდს (თავის client secret-თან ერთად) ცვლის access-ტოკენზე და, OIDC-ის შემთხვევაში, ID-ტოკენზე.
  • გამოიყენეთ PKCE მობილური და ერთგვერდიანი აპლიკაციებისთვის — ის იცავს გაცვლას მაშინ, როცა საიდუმლოს უსაფრთხოდ შესანახი ადგილი არ არსებობს.
access-ტოკენი

API-ების გამოსაძახებლად

შეზღუდული გასაღები, რომელსაც აპლიკაცია რესურსის სერვერს უგზავნის. ის ამბობს, რის უფლება აქვს მფლობელს (scope: photos.read) და არა იმას, ვინ არის ის. შეინახეთ ხანმოკლედ.

ID-ტოკენი (OIDC)

მომხმარებლის საცნობად

JWT, რომელიც აღწერს, ვინ შევიდა — sub, email, name. სწორედ ეს ამუშავებს სოციალურ შესვლას; თქვენი აპლიკაცია მას კითხულობს, რომ ლოკალური ანგარიში შექმნას ან დაამთხვიოს.

როგორც  სასტუმრო: რეცეფცია (auth სერვერი) ამოწმებს თქვენს პირადობას და გაძლევთ ნომრის ბარათს (access-ტოკენი), რომელიც ხსნის მხოლოდ თქვენს ნომერსა და დარბაზს — არა სეიფს, არა სხვების ნომრებს — და გამოსვლისას ვადა ეწურება. დამლაგებელს პასპორტს არასოდეს აძლევთ.

05 · უფლებების მოდელირება 5 წთ

როცა უკვე იცით, ვინ, როგორ
გადაწყვეტთ, რის უფლება აქვს?

ავტორიზაციას მოდელი სჭირდება და არა კოდში მიმოფანტული if-შემოწმებების გროვა. ორი მიდგომა დომინირებს; რეალური სისტემების უმეტესობა პირველით იწყებს და მეორისგან ცოტას ამატებს, როცა წესები ნიუანსური ხდება.

RBAC — როლზე დაფუძნებული წვდომის კონტროლი: უფლებები როლებზეა მიბმული, მომხმარებლებს კი როლები ენიჭებათ. ABAC — ატრიბუტებზე დაფუძნებული წვდომის კონტროლი: პოლიტიკა მოთხოვნის მომენტში წყვეტს ატრიბუტების მიხედვით — მომხმარებლის, რესურსისა და კონტექსტის (დრო, ადგილი, მფლობელობა). RBAC კითხულობს: რომელი როლი ხართ?; ABAC კითხულობს: აკმაყოფილებს თქვენი ატრიბუტები პოლიტიკას?.
RBAC — როლები → უფლებები
// assign roles to users; permissions to roles
user.roles = ["editor"]

const can = {
  editor:  ["post.read", "post.write"],
  admin:   ["post.*", "user.manage"],
}
if (!allows(user, "post.write")) throw new Forbidden()
ABAC — პოლიტიკა ატრიბუტებზე
// decide from attributes & context, per request allow if action == "post.edit" and resource.ownerId == user.id and // ownership user.dept == resource.dept and // attribute now() < resource.lockAt // context

RBAC: მომხმარებლები → როლები → უფლებები. ერთხელ შეცვალეთ, რისი გაკეთება შეუძლია "რედაქტორს", და ყველა რედაქტორი განახლდება.

როგორ ავირჩიოთ

  • დაიწყეთ RBAC-ით. ის მარტივია, აუდიტირებადი და აპლიკაციების აბსოლუტურ უმრავლესობას ფარავს. რამდენიმე მსხვილი როლი ბევრს აკეთებს.
  • დაამატეთ ABAC-ის წესები, როცა უფლებები კონკრეტულ რესურსზეა დამოკიდებული — "მფლობელს შეუძლია საკუთარი პოსტების რედაქტირება", "მხოლოდ სამუშაო საათებში".
  • გამოიყენეთ მინიმალური უფლების პრინციპი: მიეცით მინიმუმი და ნაგულისხმევად აკრძალეთ — თუ არცერთი წესი არ უშვებს, ესე იგი აკრძალულია.
  • ავტორიზაცია სერვერზე გაატარეთ, ყოველ მოთხოვნაზე. UI-ში ღილაკის დამალვა წვდომის კონტროლი არ არის.
Scope-ები vs claims — ორი სიტყვა, რომელსაც მუდმივად შეხვდებით. scope არის მსხვილი უფლება, რომელსაც access-ტოკენი ატარებს (photos.read) — რის უფლება აქვს ტოკენს. claim არის მტკიცება მომხმარებლის შესახებ ტოკენის შიგნით (role: admin, email_verified: true) — ფაქტები, რომლებსაც თქვენი ავტორიზაციის ლოგიკა კითხულობს გადაწყვეტილების მისაღებად.
06 · ინსტრუმენტების პეიზაჟი 5 წთ

ნუ დაწერთ auth-ს ხელით.
აირჩიეთ სწორი პარტნიორი.

ავთენტიფიკაცია გადაწყვეტილი ამოცანაა, ოღონდ ბასრი კიდეებით — საკუთარი ვერსიის წერა ნიშნავს ყველა იმ სისუსტის თავიდან აღმოჩენას, რომელიც ინდუსტრიამ უკვე დახურა. რეალური გადაწყვეტილებაა, რომელ სტანდარტზე ილაპარაკოთ და რომელ ინსტრუმენტს დაეყრდნოთ. აი, ლიდერები და თითოეულის ადგილი.

სტანდარტები მოკლედ. OAuth 2.0 = დელეგირებული წვდომა (API-ის ავტორიზაცია). OIDC = ვინაობა/შესვლა OAuth 2.0-ის თავზე — გამოიყენეთ თანამედროვე ვებ- და მობილური შესვლისთვის. SAML = ძველი, XML-ზე დაფუძნებული SSO-სტანდარტი — ჯერ კიდევ ყველგანაა კორპორაციებსა და უნივერსიტეტებში, ამიტომ დაუჭირეთ მხარი, როცა დიდ ორგანიზაციებზე ყიდით.

Auth0 (Okta) — მოქნილი ვეტერანი

დადებითი
მოწიფული, სტანდარტებით სრული და უკიდურესად კონფიგურირებადი (წესები, ყველა პროტოკოლი, კორპორაციული SSO).
უარყოფითი
ფასი მასშტაბთან ერთად სწრაფად იზრდება და პარამეტრების სიმრავლემ პატარა გუნდი შეიძლება დაბნიოს.

აირჩიეთ, როცა გჭირდებათ პროტოკოლების ფართო მხარდაჭერა და კორპორაციული ფუნქციონალი და გირჩევნიათ კონფიგურაცია, ვიდრე აგება.

Clerk — ყველაფერი ჩალაგებული თანამედროვე აპლიკაციებისთვის

დადებითი
მზა UI-კომპონენტები, რომლებიც პირდაპირ ჩაისმება, შესანიშნავი თავსებადობა React/Next.js-თან, სწრაფად გაშვება.
უარყოფითი
ახალგაზრდა ეკოსისტემა და ყველაზე მეტად JavaScript/edge სტეკზეა მორგებული.

აირჩიეთ, როცა თანამედროვე ვებ-აპლიკაციას აშენებთ და შესვლის ეკრანები, MFA და მომხმარებლების მართვა ერთ შუადღეში გინდათ.

Firebase Authentication — სწრაფი & მობილურისთვის მოხერხებული

დადებითი
გულუხვი უფასო ტარიფი, უმარტივესი სოციალური და ტელეფონით შესვლა, შესანიშნავია მობილურისა და MVP-ებისთვის.
უარყოფითი
გაბამთ Google-ის ეკოსისტემაზე; სუსტია კორპორაციულ SSO-სა და წვრილმარცვლოვან ავტორიზაციაში.

აირჩიეთ, როცა მობილურ აპლიკაციას ან პროტოტიპს უშვებთ და უკვე Firebase/GCP-ში ცხოვრობთ.

Keycloak — ღია კოდი, თვითჰოსტირებადი

დადებითი
უფასო, მომხმარებელზე გადასახადის გარეშე, სრული OAuth/OIDC/SAML და მონაცემები თქვენს სერვერებზე რჩება.
უარყოფითი
ექსპლუატაცია თქვენზეა — განახლებები, მასშტაბირება, ხელმისაწვდომობა და ვერსიის აწევა.

აირჩიეთ, როცა მონაცემების ადგილმდებარეობა, ღირებულება მასშტაბზე ან ვენდორზე მიბმის არიდება ოპერაციულ ტვირთს გადაწონის.

ააგეთ თავად (ბიბლიოთეკით)

დადებითი
სრული კონტროლი და მომხმარებელზე ხარჯის გარეშე; მძიმე სამუშაოს ისეთი ბიბლიოთეკები აკეთებენ, როგორიცაა Auth.js, Passport ან Spring Security.
უარყოფითი
თქვენვე იღებთ პასუხისმგებლობას ყველა კიდურა შემთხვევაზე — ჰეშირება, სესიები, პაროლის აღდგენა, MFA, გატეხვები.

აირჩიეთ, როცა მოთხოვნები მარტივი და სტაბილურია, ან შეზღუდვები ჰოსტირებულ პროვაიდერს გამორიცხავს. გამოიყენეთ შემოწმებული ბიბლიოთეკა — არასოდეს ნედლი კრიპტოგრაფია.

როგორ ავირჩიოთ, ერთი ამოსუნთქვით

  • ილაპარაკეთ OIDC-ზე მომხმარებლის შესვლისთვის და OAuth 2.0-ზე API-ზე წვდომისთვის; SAML დაამატეთ მხოლოდ მაშინ, როცა კორპორაციული კლიენტი მოითხოვს.
  • ჰოსტირებული პროვაიდერი (Auth0, Clerk, Firebase) სისწრაფეს ყიდულობს და რისკს თავის თავზე იღებს — ახალი პროდუქტისთვის თითქმის ყოველთვის სწორია.
  • თვითჰოსტინგი (Keycloak) მაშინ, როცა ღირებულება მასშტაბზე, მონაცემების ადგილმდებარეობა ან ვენდორზე მიბმის შიში დომინირებს.
  • საკუთარი აგება მხოლოდ შემოწმებული ბიბლიოთეკით, მარტივი საჭიროებებით და იმის გაცნობიერებით, თუ რა მოვლას იწერთ თავზე.
07 · სრული ნაკადი და შეჯამება 5 წთ

ერთი მოთხოვნა, თავიდან ბოლომდე.

მოდი, ყველაფერი ერთმანეთს დავუკავშიროთ: მომხმარებელი შედის სისტემაში, შემდეგ კი პოსტის რედაქტირებას ცდილობს. დააკვირდით, როგორ აკეთებს ორივე კარიბჭე თავის საქმეს — ჯერ ვინაობა, მერე უფლება — სანამ მოთხოვნა გატარდება.

შესვლა ვინაობას ერთხელ ამტკიცებს და ტოკენს გასცემს; ყოველი შემდეგი მოთხოვნა ხელახლა ამოწმებს ტოკენს (AuthN) და პოლიტიკას (AuthZ).

// runs on every protected request
function guard(req: Request) {
  const user = verifyToken(req.cookies.session)
  if (!user) throw new Unauthorized()      // 401 · AuthN

  const post = load(req.params.id)
  if (post.ownerId !== user.id &&
      !user.roles.includes("admin"))
    throw new Forbidden()                  // 403 · AuthZ
}

ორივე შემოწმება სერვერზე ცხოვრობს. ტოკენი პასუხობს, ვინ; მფლობელობის/როლის შემოწმება კი — შეიძლება თუ არა.

ხუთი წესი, რომელიც თან უნდა წაიღოთ

1ჯერ ავთენტიფიკაცია, მერე ავტორიზაცია. ვინ ხართ (401) სხვა კითხვაა, ვიდრე რისი უფლება გაქვთ (403).
2პაროლები არასოდეს შეინახოთ — შეინახეთ ნელი, salt-იანი ჰეშები (argon2id ან bcrypt). დაამატეთ MFA და სიხშირის ლიმიტი.
3სესიები მყისიერი გაუქმებისთვის, ტოკენები მასშტაბისთვის. access-ტოკენები ხანმოკლე გახადეთ და HttpOnly cookie-ებში შეინახეთ.
4შესვლისთვის გამოიყენეთ OIDC, API-ზე წვდომისთვის — OAuth 2.0. პაროლებს auth სერვერი მიხედოს; თქვენი აპლიკაცია ტოკენებს კითხულობს.
5დაიწყეთ RBAC-ითა და მინიმალური უფლების პრინციპით, სერვერზე აღსრულებულით. ხელით ნუ დაწერთ — აირჩიეთ სანდო პროვაიდერი ან ბიბლიოთეკა.
ცოდნის შემოწმება

დაგამახსოვრდათ?

ხუთი სწრაფი კითხვა ავთენტიფიკაციაზე, ჰეშირებაზე, ტოკენებზე, OAuth/OIDC-სა და ავტორიზაციაზე — მყისიერი პასუხი, შესვლის გარეშე.

შეაფასეთ ეს დასტა
იყავით პირველი

ნავიგაცია ← → ღილაკებით ან სქროლით · უკან ბიბლიოთეკაში