ในบริบทของ JWTs Stormpath ได้เขียนบทความที่เป็นประโยชน์อย่างเป็นธรรมโดยสรุปวิธีที่เป็นไปได้ในการจัดเก็บและข้อดี (dis-) ที่เกี่ยวข้องกับแต่ละวิธี
นอกจากนี้ยังมีภาพรวมสั้น ๆ ของการโจมตี XSS และ CSRF และวิธีที่คุณสามารถต่อสู้กับพวกเขา
ฉันได้แนบตัวอย่างสั้น ๆ ของบทความด้านล่างในกรณีที่บทความของพวกเขาออฟไลน์ / เว็บไซต์ของพวกเขาล้มเหลว
การจัดเก็บในท้องถิ่น
ปัญหา:
Web Storage (localStorage / sessionStorage) สามารถเข้าถึงได้ผ่าน JavaScript ในโดเมนเดียวกัน ซึ่งหมายความว่า JavaScript ใด ๆ ที่ทำงานบนไซต์ของคุณจะสามารถเข้าถึงที่เก็บข้อมูลบนเว็บได้และด้วยเหตุนี้จึงมีความเสี่ยงที่จะถูกโจมตีจากสคริปต์ข้ามไซต์ (XSS) XSS สั้นเป็นประเภทของช่องโหว่ที่ผู้โจมตีสามารถฉีด JavaScript ที่จะทำงานบนหน้าของคุณ การโจมตี XSS พื้นฐานพยายามฉีด JavaScript ผ่านอินพุตแบบฟอร์มโดยที่ผู้โจมตีแจ้งเตือน ('คุณถูกแฮ็ก'); ลงในแบบฟอร์มเพื่อดูว่าเบราว์เซอร์นั้นทำงานหรือไม่และผู้ใช้รายอื่นสามารถดูได้
การป้องกัน:
เพื่อป้องกัน XSS การตอบสนองทั่วไปคือการหลบหนีและเข้ารหัสข้อมูลที่ไม่น่าเชื่อถือทั้งหมด แต่มันก็ยังห่างไกลจากเรื่องราวทั้งหมด ในปี 2015 เว็บแอพทันสมัยใช้ JavaScript ที่โฮสต์บน CDNs หรือโครงสร้างพื้นฐานภายนอก เว็บแอพที่ทันสมัยประกอบด้วยห้องสมุด JavaScript ของบุคคลที่สามสำหรับการทดสอบ A / B การวิเคราะห์ช่องทาง / การตลาดและโฆษณา เราใช้ตัวจัดการแพคเกจเช่น Bower เพื่อนำเข้ารหัสของผู้อื่นในแอพของเรา
จะเกิดอะไรขึ้นถ้าสคริปต์ใดสคริปต์หนึ่งที่คุณใช้ถูกบุกรุก? มัลแวร์ที่เป็นอันตรายสามารถถูกฝังลงบนหน้าเว็บและที่เก็บข้อมูลบนเว็บถูกบุกรุก การโจมตี XSS ประเภทนี้สามารถรับที่เก็บข้อมูลเว็บของทุกคนที่เข้าชมไซต์ของคุณโดยที่พวกเขาไม่รู้ตัว นี่อาจเป็นสาเหตุที่หลายองค์กรแนะนำไม่ให้เก็บของมีค่าหรือไว้วางใจข้อมูลใด ๆ ในที่เก็บข้อมูลบนเว็บ ซึ่งรวมถึงตัวระบุเซสชันและโทเค็น
ในฐานะกลไกการจัดเก็บข้อมูล Web Storage ไม่บังคับใช้มาตรฐานความปลอดภัยใด ๆ ในระหว่างการถ่ายโอน ใครก็ตามที่อ่านที่เก็บข้อมูลบนเว็บและใช้งานนั้นจะต้องดำเนินการตรวจสอบสถานะของตนเพื่อให้แน่ใจว่าพวกเขาส่ง JWT ผ่าน HTTPS และไม่ใช้ HTTP
คุ้กกี้
ปัญหา:
คุกกี้เมื่อใช้กับการตั้งค่าสถานะคุกกี้ HttpOnly จะไม่สามารถเข้าถึงได้ผ่าน JavaScript และมีผลต่อ XSS นอกจากนี้คุณยังสามารถตั้งค่าสถานะคุกกี้ที่ปลอดภัยเพื่อรับประกันว่าคุกกี้จะถูกส่งผ่าน HTTPS เท่านั้น นี่คือหนึ่งในเหตุผลหลักที่คุกกี้ได้รับการยกระดับในอดีตเพื่อจัดเก็บโทเค็นหรือข้อมูลเซสชัน นักพัฒนาสมัยใหม่ลังเลที่จะใช้คุกกี้เพราะพวกเขาต้องการสถานะดั้งเดิมที่จะเก็บไว้ในเซิร์ฟเวอร์ดังนั้นจึงเป็นการละเมิดวิธีปฏิบัติที่ดีที่สุด RESTful คุกกี้เป็นกลไกการจัดเก็บไม่จำเป็นต้องมีการจัดเก็บสถานะบนเซิร์ฟเวอร์หากคุณกำลังจัดเก็บ JWT ไว้ในคุกกี้ นี่เป็นเพราะ JWT สรุปข้อมูลทุกอย่างที่เซิร์ฟเวอร์ต้องการเพื่อให้บริการตามคำขอ
อย่างไรก็ตามคุกกี้มีความเสี่ยงต่อการถูกโจมตีประเภทอื่น: การปลอมแปลงคำขอข้ามไซต์ (CSRF) การโจมตี CSRF เป็นประเภทของการโจมตีที่เกิดขึ้นเมื่อเว็บไซต์อีเมลหรือบล็อกที่เป็นอันตรายทำให้เว็บเบราว์เซอร์ของผู้ใช้ทำการกระทำที่ไม่พึงประสงค์ในเว็บไซต์ที่เชื่อถือได้ซึ่งผู้ใช้นั้นได้รับการรับรองความถูกต้องแล้ว นี่คือการหาประโยชน์ของวิธีที่เบราว์เซอร์จัดการกับคุกกี้ สามารถส่งคุกกี้ไปยังโดเมนที่อนุญาตเท่านั้น โดยค่าเริ่มต้นนี่คือโดเมนที่ แต่เดิมตั้งค่าคุกกี้ คุกกี้จะถูกส่งไปตามคำขอโดยไม่คำนึงว่าคุณอยู่ใน galaxies.com หรือ hahagonnahackyou.com
การป้องกัน:
เบราว์เซอร์ที่ทันสมัยสนับสนุนSameSite
ธงนอกเหนือไปจากและHttpOnly
Secure
วัตถุประสงค์ของการตั้งค่าสถานะนี้คือเพื่อป้องกันไม่ให้คุกกี้ถูกส่งผ่านการร้องขอข้ามไซต์ป้องกันการโจมตี CSRF หลายชนิด
สำหรับเบราว์เซอร์ที่ไม่รองรับSameSite
CSRF สามารถป้องกันได้โดยใช้รูปแบบโทเค็นที่ซิงโครไนซ์ สิ่งนี้ฟังดูซับซ้อน แต่ทุกเฟรมเวิร์คของเว็บสมัยใหม่นั้นรองรับสิ่งนี้
ตัวอย่างเช่น AngularJS มีวิธีการตรวจสอบว่าคุกกี้สามารถเข้าถึงได้โดยโดเมนของคุณเท่านั้น ส่งตรงจาก AngularJS docs:
เมื่อทำการร้องขอ XHR บริการ $ http จะอ่านโทเค็นจากคุกกี้ (ตามค่าเริ่มต้น XSRF-TOKEN) และตั้งเป็นส่วนหัว HTTP (X-XSRF-TOKEN) เนื่องจาก JavaScript ที่ทำงานบนโดเมนของคุณเท่านั้นที่สามารถอ่านคุกกี้เซิร์ฟเวอร์ของคุณจึงมั่นใจได้ว่า XHR นั้นมาจาก JavaScript ที่ทำงานบนโดเมนของคุณ คุณสามารถทำให้การปกป้อง CSRF ไร้สัญชาติได้โดยการรวมการxsrfToken
อ้างสิทธิ์ JWT:
{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}
การใช้ประโยชน์จากการป้องกัน CSRF ของเฟรมเวิร์กแอปพลิเคชันเว็บของคุณจะทำให้คุกกี้มั่นคงในการจัดเก็บ JWT CSRF สามารถป้องกันได้เพียงบางส่วนด้วยการตรวจสอบส่วนหัว HTTP Referer และ Origin จาก API ของคุณ การโจมตี CSRF จะมีส่วนอ้างอิงและแหล่งกำเนิดที่ไม่เกี่ยวข้องกับแอปพลิเคชันของคุณ
บทความเต็มสามารถพบได้ที่นี่:
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
พวกเขายังมีบทความที่มีประโยชน์เกี่ยวกับวิธีการออกแบบและใช้ JWT ที่ดีที่สุดโดยคำนึงถึงโครงสร้างของโทเค็นเอง:
https://stormpath.com/blog/jwt-the-right-way/