Trong bối cảnh của JWT , Stormpath đã viết một bài viết khá hữu ích nêu ra những cách có thể để lưu trữ chúng và những lợi thế (không liên quan) liên quan đến từng phương pháp.
Nó cũng có một cái nhìn tổng quan ngắn về các cuộc tấn công XSS và CSRF, và cách bạn có thể chiến đấu với chúng.
Tôi đã đính kèm một số đoạn ngắn của bài viết bên dưới, trong trường hợp bài viết của họ bị ngoại tuyến / trang web của họ bị sập.
Lưu trữ cục bộ
Các vấn đề:
Lưu trữ web (localStorage / sessionStorage) có thể truy cập thông qua JavaScript trên cùng một tên miền. Điều này có nghĩa là bất kỳ JavaScript nào chạy trên trang web của bạn đều có quyền truy cập vào bộ lưu trữ web và do điều này có thể dễ bị tấn công bởi kịch bản chéo trang (XSS). Tóm lại, XSS là một loại lỗ hổng trong đó kẻ tấn công có thể tiêm JavaScript sẽ chạy trên trang của bạn. Các cuộc tấn công XSS cơ bản cố gắng tiêm JavaScript thông qua các đầu vào mẫu, trong đó kẻ tấn công đưa ra cảnh báo ('Bạn bị hack'); vào một biểu mẫu để xem nếu nó được chạy bởi trình duyệt và có thể được xem bởi những người dùng khác.
Phòng ngừa:
Để ngăn XSS, phản ứng phổ biến là thoát và mã hóa tất cả dữ liệu không đáng tin cậy. Nhưng đây là xa câu chuyện đầy đủ. Trong năm 2015, các ứng dụng web hiện đại sử dụng JavaScript được lưu trữ trên CDN hoặc cơ sở hạ tầng bên ngoài. Các ứng dụng web hiện đại bao gồm các thư viện JavaScript của bên thứ 3 để thử nghiệm A / B, phân tích kênh / thị trường và quảng cáo. Chúng tôi sử dụng các trình quản lý gói như Bower để nhập mã của người khác vào ứng dụng của mình.
Điều gì nếu chỉ một trong các tập lệnh bạn sử dụng bị xâm phạm? JavaScript độc hại có thể được nhúng trên trang và Lưu trữ web bị xâm phạm. Các loại tấn công XSS này có thể khiến Web Storage của mọi người truy cập trang web của bạn mà không cần biết. Đây có lẽ là lý do tại sao một loạt các tổ chức khuyên không nên lưu trữ bất cứ thứ gì có giá trị hoặc tin tưởng bất kỳ thông tin nào trong lưu trữ web. Điều này bao gồm định danh phiên và mã thông báo.
Là một cơ chế lưu trữ, Lưu trữ Web không thực thi bất kỳ tiêu chuẩn bảo mật nào trong quá trình chuyển. Bất cứ ai đọc Lưu trữ web và sử dụng nó đều phải thực hiện trách nhiệm của mình để đảm bảo họ luôn gửi JWT qua HTTPS và không bao giờ HTTP.
Bánh quy
Các vấn đề:
Cookies, khi được sử dụng với cờ cookie HTTPOnly, không thể truy cập thông qua JavaScript và miễn dịch với XSS. Bạn cũng có thể đặt cờ Cookie bảo mật để đảm bảo cookie chỉ được gửi qua HTTPS. Đây là một trong những lý do chính mà cookie đã được tận dụng trong quá khứ để lưu trữ mã thông báo hoặc dữ liệu phiên. Các nhà phát triển hiện đại ngần ngại sử dụng cookie vì theo truyền thống họ yêu cầu phải được lưu trữ trên máy chủ, do đó phá vỡ các thực tiễn tốt nhất của RESTful. Cookie là một cơ chế lưu trữ không yêu cầu lưu trữ trạng thái trên máy chủ nếu bạn đang lưu trữ JWT trong cookie. Điều này là do JWT đóng gói mọi thứ mà máy chủ cần để phục vụ yêu cầu.
Tuy nhiên, cookie dễ bị tấn công bởi một kiểu tấn công khác: giả mạo yêu cầu chéo trang (CSRF). Tấn công CSRF là một loại tấn công xảy ra khi một trang web độc hại, email hoặc blog khiến trình duyệt web của người dùng thực hiện một hành động không mong muốn trên một trang web đáng tin cậy mà người dùng hiện đang được xác thực. Đây là một khai thác về cách trình duyệt xử lý cookie. Một cookie chỉ có thể được gửi đến các miền mà nó được cho phép. Theo mặc định, đây là tên miền ban đầu đặt cookie. Cookie sẽ được gửi cho một yêu cầu bất kể bạn đang ở trên galaxies.com hay hahagonnahackyou.com.
Phòng ngừa:
Các trình duyệt hiện đại hỗ trợ SameSite
cờ , ngoài HttpOnly
và Secure
. Mục đích của cờ này là để ngăn chặn cookie được truyền trong các yêu cầu trên nhiều trang web, ngăn chặn nhiều loại tấn công CSRF.
Đối với các trình duyệt không hỗ trợ SameSite
, CSRF có thể được ngăn chặn bằng cách sử dụng các mẫu mã thông báo được đồng bộ hóa. Điều này nghe có vẻ phức tạp, nhưng tất cả các khung web hiện đại đều hỗ trợ cho việc này.
Ví dụ: AngularJS có một giải pháp để xác thực rằng cookie chỉ có thể truy cập được bằng tên miền của bạn. Trực tiếp từ tài liệu AngularJS:
Khi thực hiện các yêu cầu XHR, dịch vụ $ http đọc mã thông báo từ cookie (theo mặc định, XSRF-TOKEN) và đặt nó làm tiêu đề HTTP (X-XSRF-TOKEN). Vì chỉ JavaScript chạy trên miền của bạn có thể đọc cookie, máy chủ của bạn có thể được đảm bảo rằng XHR đến từ JavaScript chạy trên miền của bạn. Bạn có thể làm cho bảo vệ CSRF này không trạng thái bằng cách bao gồm xsrfToken
khiếu nại JWT:
{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}
Tận dụng khả năng bảo vệ CSRF của khung ứng dụng web của bạn làm cho cookie trở nên vững chắc khi lưu trữ JWT. CSRF cũng có thể được ngăn chặn một phần bằng cách kiểm tra tiêu đề HTTP Giới thiệu và Xuất xứ từ API của bạn. Các cuộc tấn công CSRF sẽ có các tiêu đề Người giới thiệu và Xuất xứ không liên quan đến ứng dụng của bạn.
Toàn bộ bài viết có thể được tìm thấy ở đây:
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-st Storage /
Họ cũng có một bài viết hữu ích về cách thiết kế và triển khai JWT tốt nhất, liên quan đến cấu trúc của mã thông báo:
https://stormpath.com/blog/jwt-the-right-way/