সম্প্রতি, আমি স্থানীয়ভাবে সঞ্চিত JWT ব্যবহার করার সময় আমার কিছু গুরুত্বপূর্ণ শেষ পয়েন্টগুলিকে আরও সুরক্ষিত করার বিষয়ে চিন্তা করছি।
এটি নিরাপত্তার জন্য সর্বোত্তম অনুশীলন নাও হতে পারে (এক্সএসএস আক্রমণের সম্ভাবনার কারণে), তবে এটি আমার দ্বারা সেট করা হয়নি। আমাকে মানিয়ে নিতে হয়েছিল।
তাই এটিকে আরও সুরক্ষিত করার জন্য, আমি একটি সমাধান খুঁজে পেয়েছি, যেটি, আশা করি, আপনাকেও সাহায্য করবে।
আমি অনুমান করি যে আমরা সকলেই জানি JWT কী - ব্যাকএন্ড পরিষেবা দ্বারা জারি করা একটি টোকেন, যা ফ্রন্টএন্ড দ্বারা সংশোধন করা যায় না, কারণ এটি স্বাক্ষর পরিবর্তন করবে এবং স্বয়ংক্রিয়ভাবে টোকেনটি অবৈধ হয়ে যাবে।
এটি দুর্দান্ত শোনাচ্ছে, যতক্ষণ না আমরা এমন পরিস্থিতির সাথে দেখা করি যেখানে টোকেন চুরি হতে পারে - যেমন আমার ক্ষেত্রে XSS আক্রমণের ক্ষেত্রে। অনেক ওয়েবসাইট শুধুমাত্র HTTP-র কুকির পরিবর্তে স্থানীয় স্টোরেজে টোকেন সঞ্চয় করে, তাই তারাও দুর্বল।
সুতরাং, যখন ফ্রন্টএন্ড টোকেন সংরক্ষণের উপায় পরিবর্তন করা সম্ভব হয় না, তখন আমাদের টোকেন ইস্যু করার এবং যাচাই করার উপায় পরিবর্তন করতে হবে, এবং এই মুহুর্তটি যখন আমি আপনাকে একটি সহজ সমাধানের সাথে পরিচয় করিয়ে দিতে চাই - হ্যাশড ফিঙ্গারপ্রিন্ট সহ JWT, কিন্তু কোড দেখি
ধরা যাক, টোকেন ইস্যু করার জন্য আমাদের একটি এন্ডপয়েন্ট আছে, আসুন একে সাইন-ইন এন্ডপয়েন্ট বলি
@Controller('v1/sign-in') export class SignInAction { constructor(private jwtService: JwtService) {} @Post() async handle( @Req() request: Request, @Body() body: SignInHttpRequest, ): Promise<SignInHttpResponse> { const ip = request.headers['x-forwarded-for'] || request.socket.remoteAddress; const userAgent = request.headers['user-agent']; const token = this.jwtService.sign({ email: body.email, fingerprint: getSHA512Hash(`${ip}${userAgent}`), // It's worth to mention, that to make it even more secure, you should add salt }); return { token, }; } }
তাই আমরা এখানে যা করছি, মূলত ব্যবহারকারীর কাছ থেকে ব্যবহারকারী এজেন্ট এবং দূরবর্তী আইপি সংগ্রহ করা যা সংযোগ করছে, এটি হ্যাশ করছে এবং তারপর এটিকে JWT টোকেনে রাখছে, তাই এমনকি যদি ব্যবহারকারী বা আক্রমণকারী দেখতে চান যে JWT টোকেনের ভিতরে কী আছে, তারা কেবলমাত্র কিছু র্যান্ডম হ্যাশ মান দেখুন
কিন্তু এটা কিভাবে আমার নিরাপত্তা বাড়াবে আপনি জিজ্ঞাসা? আসুন আমাদের দ্বিতীয় এন্ডপয়েন্টটি দেখে নেওয়া যাক, আঙ্গুলের ছাপ দেখান
@Controller('v1/fingerprint') @UseGuards(AuthGuard(JWT_STRATEGY)) export class ShowFingerPrintAction { @Get() async handle(@Req() request) { return { fingerprint: request.user.fingerprint, }; } }
প্রথম দিকে, এটা বিশেষ কিছু না. এন্ডপয়েন্ট যা অনুরোধ থেকে ফিঙ্গারপ্রিন্ট ফেরত দেয়, তাহলে কি এটিকে আরও নিরাপদ করে? JWT_STRATEGY!
export const JWT_STRATEGY = 'JWT'; @Injectable() export class JwtStrategy extends PassportStrategy(Strategy, JWT_STRATEGY) { constructor() { super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), ignoreExpiration: false, secretOrKey: 'hard!to-guess_secret', passReqToCallback: true, }); } async validate(request: Request, payload: any): Promise<any> { const fingerprint = payload.fingerprint; const ip = request.headers['x-forwarded-for'] || request.socket.remoteAddress; const userAgent = request.headers['user-agent']; const calculatedFingerprint = getSHA512Hash(`${ip}${userAgent}`); // It's worth to mention, that to make it even more secure, you should add salt if (fingerprint !== calculatedFingerprint) { throw new BadRequestException('Invalid fingerprint'); } return payload; } }
আপনি দেখতে পাচ্ছেন, কৌশলে, আমরা সাইন-ইন এন্ডপয়েন্ট থেকে সেগুলি বের করার সময় একই মানগুলি বের করছি এবং সেগুলি তুলনা করছি - যদি আইপি বা ব্যবহারকারী এজেন্ট পরিবর্তিত হয়, তাহলে আমরা আমাদের আঙ্গুলের ছাপের শেষ পয়েন্টে অ্যাক্সেস অস্বীকার করব৷
এটি এমন ঘটনা যেখানে আক্রমণকারী আমাদের টোকেন চুরি করলেও, সে এটি দিয়ে কিছু করতে পারবে না, কারণ
এভাবেই আমরা আমাদের গুরুত্বপূর্ণ এন্ডপয়েন্টকে খুব সহজ উপায়ে রক্ষা করতে পারি, তবে অবশ্যই কিছু ট্রেডঅফ আছে
প্রথম সমস্যাটির জন্য, আপনি অবশ্যই শুধুমাত্র আইপি পরীক্ষা করতে পারেন এবং টোকেন দেওয়ার সময় এটি হ্যাশও করবেন না, কিন্তু তারপরে সম্ভাব্য আক্রমণকারী আক্রমণের ভেক্টর (আইপি স্পুফিং বা অন্যান্য পদ্ধতি) জানেন, তাই কিছু ত্যাগ করা নিরাপদ। নিরাপত্তার জন্য কর্মক্ষমতা।
আমি আশা করি যে এই পদ্ধতিটি আপনাকে আপনার গুরুত্বপূর্ণ শেষ পয়েন্টগুলিতে নিরাপত্তার একটি অতিরিক্ত স্তর প্রবর্তন করতে সাহায্য করবে।
কাজের সোর্স কোডের লিঙ্ক: সোর্স কোড
টিপস: