Token là gì? Nó hoạt động như thế nào?
Ngày mới học web có nhiều lần mình gửi form lên bị lỗi do thiếu token nên mình đã ngầm hiểu "gửi form lên là phải có token không thì lỗi" chứ cũng ko biết nó để làm gì và mặc kệ nó. Tới khi thực tập thì làm việc với người khác viết Vuejs, ko dùng form html nữa mà dùng axios gửi lên. Ở đây mình ko thấy set token như khi trước mình học mà vẫn gửi lên được bình thường. Dần dần mình cũng càng mờ nhạt về Token.
Mới đây mình có làm một ứng dụng chat realtime cho cả web và app. Ở web vẫn vậy, vẫn ko biết token nó được dùng khi nào mà mọi thứ vẫn hoạt động bình thường. Còn khi app kết nối thì bị lỗi 419 "CSRF token mismatch" mà chả biết nó hoạt động ra sao để khắc phục cả.
Nhờ các bạn giải thích giúp mình hiểu để mình khắc phục được lỗi trên. Cảm ơn các bạn!
1 CÂU TRẢ LỜI
Có lẽ câu hỏi của bạn không được rõ ràng cho lắm nhỉ Hình như bạn đang hỏi về CSRF Token, chứ không phải khái niệm token chung chung.
Token thì bạn có thể hiểu đơn giản là một đoạn string dùng để chứng minh bạn có quyền thực hiện một công việc nào đó. Chẳng hạn như chúng ta có access token dùng để kiểm tra bạn có quyền truy cập vào dữ liệu/có quyền gọi API ...
CSRF Token là một đoạn string có thể được sử dụng để bảo vệ người dùng khỏi các cuộc tấn công Cross-Site Request Forgery (CSRF), hay nói cách khác là để chứng minh request được gửi lên server là hợp lệ. Cơ chế của nó đơn giản là ở phía server khi render ra view, thì sẽ sinh ra một đoạn string random, và lưu vào trong session của người dùng rồi trả ra cho client. Phía trình duyệt muốn gửi request lên server thì sẽ cần phải gửi đúng đoạn string đó lên, nếu không server sẽ từ chối response. Đoạn string đó được gọi là CSRF Token.
Việc bạn code Vuejs, Reactjs gọi API bằng axios mà không thấy set token như trước thì là do đơn giản công việc đó đã được làm ở chỗ khác, do người khác config cho rồi thôi Những ứng dụng dạng Single Web App thì do server chỉ thực hiện trả về html/css/js ở request đầu tiên, và các request sau chỉ gọi API lấy dữ liệu json rồi render ra view, thế nên việc setup default csrf token cũng chỉ cần thực hiện một lần duy nhất.
Còn việc app của bạn kết nối bị lỗi "CSRF token mismatch"
thì là do API app đang gọi vốn dành cho web, và nó có xử lý validate csrf token từ client gửi lên (trong middleware chẳng hạn), thế nên app gọi trực tiếp API sẽ bị lỗi. Thường thì các app sẽ có cơ chế authenticate qua access token riêng rồi, nên API dành cho app sẽ được remove phần validate csrf token đi.
Bạn có thể đọc thêm một vài bài viết trên Viblo về tấn công CSRF, lúc đó bạn có thể sẽ hiểu rõ hơn về CSRF Token
- https://viblo.asia/p/csrf-la-cai-quai-gi-hoat-dong-nhu-the-nao-bWrZngnOlxw
- https://viblo.asia/p/laravel-tim-hieu-ve-csrf-protection-RnB5pNX6ZPG
- https://viblo.asia/p/ky-thuat-tan-cong-csrf-va-cach-phong-chong-amoG84bOGz8P
- https://viblo.asia/p/tim-hieu-csrf-la-gi-cach-phong-chong-tan-cong-gia-mao-RQqKLAyOZ7z
- https://viblo.asia/p/tan-cong-csrf-va-cach-phong-chong-m68Z0mnAlkG
Thực ra cái mình hỏi là CSRF-Token, do thâm hụt kiến thức nên đã nhầm tưởng mọi thứ là Token. Hiện lại lỗi mình gặp phải chính xác là khi app lắng nghe các event từ Laravel thông qua nodejs thì ở terminal của node log ra lỗi là "CSRF token mismatch". Ở đây mình chưa sử dụng route nào thì làm sao để làm được đoạn "Thường thì các app sẽ có cơ chế authenticate qua access token riêng rồi, nên API dành cho app sẽ được remove phần validate csrf token đi." như bạn Tran Duc Thang comment đây mọi người ơi !
Như bác Thắng trả lời ở dưới OK rồi đó bạn.