JWT security: সাধারণ ভুল ও এড়ানোর উপায়

JWT সর্বত্র আছে, ভুলও তাই। JWT আসলে কী গ্যারান্টি দেয় এবং কোন checklist একে নিরাপদ রাখে, জানুন।

তালাসহ একটি signed token

JSON Web Token (JWT) তিন অংশের একটি ছোট string: header, payload (user ID ও expiry-র মতো claim) এবং signature। Server token-এ সই করে, পরে signature যাচাই করে database lookup ছাড়াই claim বিশ্বাস করে।

JWT কী দেয় আর কী দেয় না

  • এটি প্রমাণ করে token key-ধারী কেউ সই করেছে, আর বদলানো হয়নি।
  • এটি কনটেন্ট লুকায় না। Payload শুধু Base64 encoded, যে কেউ পড়তে পারে। এতে কখনো গোপন কিছু রাখবেন না।
  • এটি নিজে বাতিল করা যায় না। User logout করলে বা ban হলেও মেয়াদ শেষ পর্যন্ত এটি বৈধ।

সাধারণ ভুল

১. header-এর algorithm বিশ্বাস করা। কিছু library আগে alg: none (signature নেই) নিত বা token-কে algorithm বাছতে দিত। সমাধান: server অনুমোদিত algorithm ঠিক করে দেয় এবং বাকি সব প্রত্যাখ্যান করে।

২. Algorithm confusion। RS256 token-কে public key দিয়ে HMAC secret-এর মতো যাচাই করা। সমাধান: algorithm পিন করুন, আর কাজ অনুযায়ী আলাদা key রাখুন।

৩. দুর্বল বা ডিফল্ট signing secret। ছোট বা অনুমানযোগ্য HMAC secret offline brute-force করা যায়। সমাধান: secret manager থেকে লম্বা random secret (৩২+ byte) বা asymmetric key ব্যবহার করুন।

৪. Expiry নেই বা খুব লম্বা। চুরি যাওয়া token চিরকাল চলে। সমাধান: স্বল্পস্থায়ী access token (যেমন ৫ থেকে ১৫ মিনিট) ও বাতিল করা যায় এমন refresh token।

৫. Claim যাচাই বাদ দেওয়া। সবসময় exp (মেয়াদ), iss (issuer), aud (audience) ও দরকারে nbf যাচাই করুন।

৬. Browser-এ খারাপভাবে রাখা। localStorage-এ রাখলে যেকোনো XSS চুরি করতে পারে। HttpOnly, Secure, SameSite cookie JavaScript থেকে দূরে রাখে, কিন্তু তখন CSRF থেকে রক্ষা করতে হবে।

৭. Authorization-এ token-এর data অনেকক্ষণ বিশ্বাস করা। Payload-এর role মেয়াদ শেষ পর্যন্ত পুরোনো থাকে। Token ছোট রাখুন বা গুরুত্বপূর্ণ permission server-এ যাচাই করুন।

৮. Payload-এ সংবেদনশীল data রাখা। মনে রাখুন এটি পড়া যায়।

বাতিল করার উপায়

  • ছোট expiry ও server-এ রাখা refresh token।
  • বাতিল token ID-র (jti) denylist, মেয়াদসহ।
  • User record-এ token-এর version: বদলালে সব token বাতিল।

JWT আদৌ দরকার কি?

এক backend-এর সাধারণ ওয়েব অ্যাপে server-side session (HttpOnly cookie-তে random ID) সহজ এবং বাতিল করা সহজ। JWT ভালো service-থেকে-service call ও স্বল্পস্থায়ী delegated access-এ, প্রতিটি login-এর ডিফল্ট হিসেবে নয়।

Checklist

  • Algorithm ও key server-এ allow-list করুন।
  • শক্ত secret বা asymmetric key, নিয়মিত বদলানো।
  • ছোট expiry, বাতিলযোগ্য refresh।
  • exp, iss, aud যাচাই।
  • Payload-এ গোপন কিছু নয়।
  • CSRF সুরক্ষাসহ HttpOnly cookie, অথবা খুব ছোট in-memory token।

মূল কথা: JWT প্রমাণ করে কে সই করেছে, এখনও বৈধ কি না নয়। Algorithm পিন করুন, token স্বল্পস্থায়ী রাখুন, আর শুধু login দরকার হলে session ব্যবহার করুন।


ওয়েব সিকিউরিটি সিরিজ, পর্ব ২ (আরও bug শ্রেণি ও hardening): 1 নম্বর (মোট 6)।

আরও পড়ুন

Security header checklist: HSTS, CSP, frame সুরক্ষা ও আরও

কয়েকটি response header পুরো এক শ্রেণির আক্রমণ বন্ধ করে। সেট করার সংক্ষিপ্ত তালিকা, প্রতিটির কাজ ও পরীক্ষার উপায় দেখুন।

ওয়েব সিকিউরিটি•২ মিনিটে পড়া

XXE: XML external entity আক্রমণ ও বন্ধ করার উপায়

XML-এর একটি feature ডকুমেন্টকে বাইরের কনটেন্ট টেনে আনতে দেয়। আপনার parser অনুমতি দিলে আক্রমণকারী এটি ব্যবহার করতে পারে। সমাধান একটি parser সেটিং।

ওয়েব সিকিউরিটি•২ মিনিটে পড়া