Bỏ qua đến nội dung
KhaiziNam Blog KhaiziNam Blog
Quay lại
Read in English

Session vs JWT Phỏng Vấn: Hướng Dẫn Đầy Đủ Để Không Bao Giờ Bị Hỏi Khó

Bạn biết Session và JWT là gì nhưng cứ lúng túng khi interviewer hỏi sâu hơn? Bài viết này phân tích toàn diện cơ chế hoạt động, so sánh thực chiến, và các câu hỏi phỏng vấn thường gặp nhất về Session vs JWT — để bạn trả lời tự tin, có chiều sâu, không chỉ đọc thuộc định nghĩa.

Trong hầu hết các buổi phỏng vấn backend junior, câu hỏi về authentication xuất hiện gần như chắc chắn. “Session hay JWT, bạn dùng cái nào và tại sao?” là câu hỏi tưởng đơn giản nhưng lại là bẫy phân loại ứng viên rõ ràng nhất — người hiểu thực sự sẽ nói về trade-off, người học vẹt sẽ chỉ nêu định nghĩa.

Mục Lục

1. Bản chất vấn đề: tại sao authentication lại phức tạp?

2. Session hoạt động như thế nào — từ request đến response

3. JWT hoạt động như thế nào — giải phẫu một token

4. So sánh trực tiếp: Session vs JWT theo từng tiêu chí

5. Khi nào dùng Session, khi nào dùng JWT

6. Case study thực tế

7. Sai lầm phổ biến khi trả lời câu hỏi này

8. Hỏi đáp nhanh


Bản Chất Vấn Đề: Tại Sao Authentication Lại Phức Tạp?

HTTP là giao thức stateless — mỗi request hoàn toàn độc lập, server không nhớ bạn là ai từ request trước. Đây là thiết kế cố ý để web có thể scale, nhưng nó tạo ra một vấn đề thực tế: làm thế nào để server biết request này đến từ một user đã đăng nhập?

Câu trả lời là phải có cơ chế lưu trạng thái ở đâu đó — hoặc ở phía server (Session), hoặc ở phía client dưới dạng token tự mang thông tin (JWT). Mỗi cách giải quyết cùng một vấn đề nhưng với những đánh đổi hoàn toàn khác nhau, và hiểu rõ những đánh đổi đó chính là thứ interviewer muốn thấy.

Bài viết này là phần bổ sung cho Câu Hỏi Phỏng Vấn Backend Junior: Tổng Hợp Đầy Đủ Từ Database Đến API, Auth và Cache — nếu bạn chưa đọc, hãy đọc trước để có bức tranh rộng hơn về những gì cần chuẩn bị.

Session Hoạt Động Như Thế Nào — Từ Request Đến Response

Flow đăng nhập bằng Session

Khi user đăng nhập thành công, server tạo ra một session record lưu trong bộ nhớ (RAM), database, hoặc Redis — chứa thông tin như user ID, role, và thời gian hết hạn. Server sau đó tạo một session ID ngẫu nhiên (thường là chuỗi hex dài), gửi về client qua Set-Cookie header. Client lưu cookie này và tự động gửi kèm trong mọi request tiếp theo.

Ở mỗi request, server nhận session ID từ cookie, tra cứu trong session store, tìm thấy thông tin user, xác nhận request hợp lệ. Nếu không tìm thấy hoặc session đã hết hạn, server trả về 401.

Điểm mạnh của Session
Điểm yếu của Session

JWT Hoạt Động Như Thế Nào — Giải Phẫu Một Token

Cấu trúc của một JWT

JWT (JSON Web Token) gồm ba phần cách nhau bởi dấu chấm: Header.Payload.Signature — tất cả được encode bằng Base64URL.

Header chứa algorithm dùng để ký (thường là HS256 hoặc RS256) và loại token. Payload chứa claims — thông tin về user như user_id, role, email, và thời gian hết hạn (exp). Signature là kết quả của việc ký Header + Payload bằng secret key — đây là phần đảm bảo token không bị tamper.

Quan trọng cần hiểu: Payload KHÔNG được mã hóa — chỉ được encode. Bất kỳ ai có token đều có thể decode và đọc payload. Chỉ có Signature là được ký — nếu ai đó sửa payload, signature sẽ không còn hợp lệ và server sẽ reject.

Flow đăng nhập bằng JWT

User đăng nhập → server tạo JWT, ký bằng secret key, trả về client → client lưu token (thường trong localStorage hoặc httpOnly cookie) → mọi request tiếp theo gửi kèm token trong Authorization header: Bearer → server nhận token, verify signature bằng secret key, decode payload lấy thông tin user — tất cả mà không cần tra cứu database hay session store.

Điểm mạnh của JWT
Điểm yếu của JWT

So Sánh Trực Tiếp: Session vs JWT Theo Từng Tiêu Chí

Lưu trạng thái

Session: Stateful — server lưu session store. JWT: Stateless — client lưu token, server không lưu gì.

Khả năng revoke

Session: Tức thì — xóa session record là xong. JWT: Không thể revoke trước exp — phải dùng blacklist hoặc access/refresh token pattern để workaround.

Scalability

Session: Cần centralized store (Redis) khi scale nhiều server. JWT: Native stateless — scale horizontal dễ dàng, không cần shared store.

Bảo mật payload

Session: Client không biết gì về session data — chỉ có ID. JWT: Payload có thể decode bởi bất kỳ ai — không lưu data nhạy cảm.

Phù hợp với kiến trúc

Session: Monolithic app, same-domain frontend/backend, cần revoke ngay lập tức (banking, admin). JWT: Microservices, mobile app, cross-domain, third-party API access.

Khi Nào Dùng Session, Khi Nào Dùng JWT

Đây là câu hỏi mà nhiều interviewer thực sự muốn nghe câu trả lời của bạn — không phải “JWT tốt hơn” hay “Session cũ rồi”, mà là tư duy đánh giá use case.

Dùng Session khi: Ứng dụng web truyền thống cùng domain, cần logout ngay lập tức trên tất cả thiết bị (ứng dụng tài chính, ngân hàng, hệ thống admin), không có yêu cầu scale horizontal phức tạp, hoặc đang dùng framework có session support mạnh như Laravel, Rails, Django.

Dùng JWT khi: Kiến trúc microservices với nhiều service cần verify user, mobile app (không dùng cookie được), Single Page Application với API riêng biệt, cần cấp token cho third-party service, hoặc hệ thống cần scale horizontal mà không muốn quản lý centralized session store.

Dùng cả hai (hybrid): Một pattern phổ biến trong production là dùng Session cho web app chính (vì cần revoke ngay) và JWT cho mobile API hoặc third-party integration. Đây là câu trả lời “senior” mà junior ít khi nghĩ đến nhưng sẽ gây ấn tượng mạnh nếu bạn đề cập.

Case Study Thực Tế

Hùng phỏng vấn vị trí backend junior tại một công ty fintech đang xây dựng ứng dụng mobile banking. Interviewer hỏi: “Bạn sẽ chọn Session hay JWT để authenticate user trên mobile app của chúng tôi và tại sao?”

Câu trả lời của Hùng: “Với mobile app, tôi sẽ chọn JWT với access/refresh token pattern. Mobile client không xử lý cookie tốt như browser, và JWT phù hợp hơn cho stateless authentication qua REST API. Tuy nhiên vì đây là ứng dụng tài chính, tôi sẽ dùng access token ngắn hạn — 15 phút — kết hợp refresh token lưu trong secure storage của thiết bị. Nếu phát hiện đăng nhập đáng ngờ, refresh token sẽ bị revoke phía server để buộc user đăng nhập lại.”

Interviewer hỏi tiếp: “Nếu user bị mất điện thoại, bạn xử lý thế nào?” — Hùng trả lời: “Implement một endpoint revoke-all-tokens cho user đó — về cơ bản là maintain một blacklist refresh token hoặc dùng token version trong database. Đây là điểm chúng tôi phải chấp nhận thêm state để đảm bảo bảo mật.”

Kết quả: Hùng được đánh giá cao vì không chỉ chọn một cách mà giải thích được trade-off và cách xử lý edge case — đây chính là tư duy mà một backend engineer cần có.

Sai Lầm Phổ Biến Khi Trả Lời Câu Hỏi Này

Hỏi Đáp Nhanh

Hỏi: JWT có phải là OAuth không?

Đáp: Không — đây là hai khái niệm khác nhau thường bị nhầm lẫn. JWT là định dạng token — một cách để encode và ký thông tin. OAuth 2.0 là authorization framework — một giao thức để cấp quyền truy cập. JWT thường được dùng như format cho access token trong OAuth 2.0, nhưng OAuth không bắt buộc phải dùng JWT — có thể dùng opaque token thay thế.

Đáp: Đây là một trong những câu tranh luận nhất trong cộng đồng web security. localStorage dễ implement nhưng dễ bị XSS đọc. httpOnly Cookie chống XSS tốt hơn nhưng cần CSRF protection và gặp vấn đề với cross-domain. Lựa chọn phổ biến nhất trong production: httpOnly, Secure, SameSite=Strict cookie cho web app; secure storage (Keychain/Keystore) cho mobile. Không có câu trả lời hoàn hảo — mỗi cách có trade-off.

Hỏi: HS256 và RS256 trong JWT khác nhau thế nào?

Đáp: HS256 dùng HMAC với một secret key duy nhất để cả ký lẫn verify — đơn giản nhưng server nào verify cũng phải biết secret key. RS256 dùng RSA key pair — private key để ký, public key để verify — phù hợp hơn cho microservices vì chỉ cần distribute public key, giữ private key an toàn ở auth server. Với hệ thống đơn giản một server, HS256 đủ dùng. Với microservices hoặc third-party verification, RS256 là lựa chọn tốt hơn.

Hỏi: Refresh token là gì và tại sao cần?

Đáp: Access token JWT thường có thời gian sống ngắn (5–15 phút) để giảm rủi ro nếu bị đánh cắp. Nhưng không thể bắt user đăng nhập lại mỗi 15 phút — đây là lúc refresh token vào cuộc. Refresh token là một token riêng biệt, thời gian sống dài (7–30 ngày), được lưu an toàn. Khi access token hết hạn, client dùng refresh token để lấy access token mới mà không cần user nhập lại password. Refresh token được lưu phía server — có thể revoke bất cứ lúc nào.

Hỏi: Phỏng vấn NodeJS và PHP có hỏi khác nhau về Session/JWT không?

Đáp: Concept thì giống nhau, nhưng implementation detail khác nhau. Với PHP/Laravel, interviewer có thể hỏi về Laravel Sanctum vs Passport, session driver config (file, database, Redis), và cookie encryption. Với NodeJS, câu hỏi thường xoay quanh express-session, jsonwebtoken library, và middleware pattern.

Tổng Kết

Session và JWT không phải cuộc chiến ai thắng ai — chúng là hai công cụ giải quyết cùng một vấn đề theo hai cách khác nhau, mỗi cách phù hợp với một bối cảnh khác nhau. Interviewer không muốn nghe bạn chọn đúng — họ muốn thấy bạn biết tại sao mình chọn và tại sao cách kia cũng có thể đúng trong tình huống khác.

Trước buổi phỏng vấn backend, hãy tự implement một lần cả hai — một mini app dùng Session, một app dùng JWT với refresh token. Kinh nghiệm tay trên sẽ giúp bạn trả lời mọi follow-up question tự nhiên hơn bất kỳ bài học thuộc lòng nào.

Tác giả: Nguyễn Hữu Khải

21/04/2026

Xem thêm: 


Chia sẻ bài viết:

Bài viết liên quan

Mức lương fresher junior IT 2026 - PHP, NodeJS, React, Flutter thực tế

Bảng lương thực tế của fresher và junior IT Việt Nam năm 2026 theo từng stack - PHP/Laravel, Node.js, ReactJS, Flutter - kèm cách đọc con số để biết bạn đang ở đâu trên thị trường, dù bạn chưa đi làm hay đã đi làm 1-2 năm.

Portfolio cho dev junior - cần có gì để được chú ý

Portfolio developer junior là tập hợp các project thực tế, kỹ năng và thông tin nghề nghiệp mà bạn trình bày để nhà tuyển dụng đánh giá năng lực - thay thế cho phần kinh nghiệm làm việc còn trống trên CV. Với fresher và junior developer, portfolio không phải thứ "có thì tốt" - đó là bằng chứng duy nhất bạn có thể đưa ra để chứng minh bạn thực sự biết làm việc, không chỉ biết lý thuyết.

Cover Letter Fresher IT: Cách Viết Để Được Gọi Phỏng Vấn

Cách viết cover letter cho fresher IT khi chưa có kinh nghiệm, kèm mẫu thực tế, cấu trúc chuẩn và mẹo tăng tỷ lệ vượt qua vòng lọc CV.

Ngôn ngữ cơ thể trong phỏng vấn — những điều vô tình mất điểm

Ngôn ngữ cơ thể phỏng vấn IT là tập hợp những tín hiệu phi ngôn ngữ — tư thế, ánh mắt, cử chỉ tay, giọng điệu — mà nhà tuyển dụng quan sát song song với câu trả lời kỹ thuật của bạn. Hiểu và kiểm soát tốt những tín hiệu này giúp bạn tạo ấn tượng chuyên nghiệp ngay từ những giây đầu tiên bước vào phòng phỏng vấn.

Cách đặt câu hỏi ngược khi phỏng vấn IT — đừng chỉ hỏi lương

Hướng dẫn cách đặt câu hỏi ngược khi phỏng vấn IT dành cho fresher và junior developer — tại sao phần "bạn có câu hỏi gì không" quan trọng hơn bạn nghĩ, 20+ câu hỏi thực tế phân loại theo mục đích, những câu tuyệt đối không nên hỏi, và cách chọn đúng câu hỏi theo từng vòng phỏng vấn.

Vì sao bạn chọn ngành IT — câu trả lời tạo ấn tượng với HR khi phỏng vấn

Hướng dẫn cách trả lời câu hỏi "vì sao bạn chọn ngành IT" trong phỏng vấn — phân tích điều HR thực sự muốn nghe, framework xây dựng câu trả lời theo từng hoàn cảnh, script mẫu cho fresher và career changer, cùng các lỗi phổ biến khiến câu trả lời nghe sáo rỗng và không đáng tin.

Điểm yếu lớn nhất của bạn là gì — cách trả lời không bị loại ngay khi phỏng vấn IT

Hướng dẫn cách trả lời câu hỏi "điểm yếu lớn nhất của bạn là gì" trong phỏng vấn IT — phân tích tại sao câu này là bẫy, framework trả lời 3 bước, script mẫu cho fresher và junior developer, cùng danh sách lỗi hay gặp khiến ứng viên bị loại ngay lập tức.

Câu Hỏi Phỏng Vấn ReactJS Junior: 30+ Câu Thực Tế Kèm Đáp Án Chuẩn 2026

Tổng hợp 30+ câu hỏi phỏng vấn ReactJS junior hay gặp nhất năm 2026 — từ Virtual DOM, hooks, state management đến performance optimization — kèm đáp án chi tiết và ví dụ code giúp bạn tự tin vượt qua mọi vòng technical interview.Bạn đã học React được vài tháng, build được project, nhưng mỗi lần vào phỏng vấn lại bị hỏi những thứ không có trong tutorial nào bạn từng đọc? "useEffect cleanup function

Refresh Token Node.js và Laravel: Hướng Dẫn Implement Chuẩn Production 2026

Hướng dẫn implement Refresh Token hoàn chỉnh cho cả Node.js (Express) và Laravel PHP — từ thiết kế database, viết API endpoint, xử lý rotation, đến các lỗi thường gặp — giúp developer xây hệ thống JWT authentication chuẩn production trong năm 2026.

Session vs JWT: Developer Nên Chọn Cái Nào? So Sánh Thực Tế 2026

Phân tích chi tiết Session và JWT theo 6 tiêu chí kỹ thuật thực tế - kiến trúc, revocation, scaling, hiệu năng, bảo mật và độ phức tạp — giúp developer đưa ra quyết định đúng cho từng loại dự án trong năm 2026.


Bài trước
Câu Hỏi Phỏng Vấn ReactJS Junior: Hooks, Virtual DOM, State — Tổng Hợp Đầy Đủ Kèm Đáp Án
Bài tiếp theo
Cách Tạo CV IT Cho Fresher Bằng LaTeX Và AI