একটি নিরাপদ পদ্ধতি হলো JWT টোকেনকে HTTP-only কুকিতে সংরক্ষণ করা, যা JavaScript কোডের মাধ্যমে অ্যাক্সেস করা যাবে না। এটি XSS (Cross-Site Scripting) আক্রমণ প্রতিরোধে সহায়তা করে। এখানে একটি বাস্তব উদাহরণ দিয়ে দেখানো হয়েছে:
Django Rest Framework দিয়ে সুরক্ষিতভাবে টোকেন প্রদান
- প্রথম ধাপ: JWT Authentication সেটআপ করা।ইনস্টলেশন:
pip install djangorestframework-simplejwt
সেটিংস আপডেট করা:
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework_simplejwt',
...
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
from datetime import timedelta
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': True,
'BLACKLIST_AFTER_ROTATION': True,
}
টোকেন প্রাপ্তির জন্য একটি ভিউ তৈরি করা:
from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework.response import Response
from rest_framework import status
from django.http import JsonResponse
class CustomTokenObtainPairView(TokenObtainPairView):
def post(self, request, *args, **kwargs):
response = super().post(request, *args, **kwargs)
tokens = response.data
# টোকেন HTTP-only কুকিতে সেট করা
response = JsonResponse({'message': 'Logged in successfully'})
response.set_cookie(
key='access_token',
value=tokens['access'],
httponly=True, # HTTP-only কুকি
secure=True, # HTTPS ব্যবহারের জন্য
samesite='Strict', # Cross-Site রিকোয়েস্ট ব্লক করার জন্য
max_age=300 # 5 মিনিটে মেয়াদ শেষ হবে
)
response.set_cookie(
key='refresh_token',
value=tokens['refresh'],
httponly=True,
secure=True,
samesite='Strict',
max_age=86400 # 1 দিনে মেয়াদ শেষ হবে
)
return response
URL সেটআপ:
from django.urls import path
from .views import CustomTokenObtainPairView
urlpatterns = [
path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
]
React.js থেকে টোকেন রিসিভ করা এবং ব্যবহার করা
React.js থেকে টোকেন রিসিভ করার সময় কুকি ব্যবহারের কিছু নিয়ম রয়েছে।
- CORS সুরক্ষা নিশ্চিত করা: Django প্রজেক্টে
django-cors-headersইনস্টল করে CORS পলিসি সঠিকভাবে কনফিগার করুন।
pip install django-cors-headers
সেটিংস আপডেট করুন:
# settings.py
INSTALLED_APPS = [
...
'corsheaders',
...
]
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
...
]
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000", # React অ্যাপের URL
]
React.js থেকে লগইন রিকোয়েস্ট পাঠানো:
// React.js ফ্রন্টএন্ড
import axios from 'axios';
const login = async (username, password) => {
try {
const response = await axios.post(
'http://localhost:8000/api/token/',
{ username, password },
{ withCredentials: true } // কুকি রিসিভ করার জন্য
);
if (response.data.message === 'Logged in successfully') {
alert('Login successful!');
}
} catch (error) {
console.error('Login failed:', error);
}
};
// লগইন ফাংশন কল করার জন্য
login('yourUsername', 'yourPassword');
কেন এই পদ্ধতি সুরক্ষিত:
- HTTP-only কুকি: HTTP-only কুকি JavaScript এর মাধ্যমে অ্যাক্সেস করা যাবে না, যা XSS আক্রমণ প্রতিরোধে সাহায্য করে।
- Secure Flag: কুকি শুধুমাত্র HTTPS এর মাধ্যমে পাঠানো হয়, যা নিরাপত্তা আরও বাড়ায়।
- SameSite Policy: SameSite পলিসি Cross-Site রিকোয়েস্ট ব্লক করতে সাহায্য করে, CSRF আক্রমণ প্রতিরোধে কার্যকর।
অতিরিক্ত পরামর্শ:
- টোকেন রিফ্রেশ ব্যবস্থা: একটি আলাদা এন্ডপয়েন্ট তৈরি করুন যা রিফ্রেশ টোকেন ব্যবহার করে নতুন অ্যাক্সেস টোকেন প্রদান করবে।
- অ্যাডিশনাল সুরক্ষা: Content Security Policy (CSP) এবং অন্যান্য নিরাপত্তা ব্যবস্থা ব্যবহার করে আরও সুরক্ষিত করা সম্ভব।