Web Session และ Web Cookie

cookieweb session และ web cookie เป็นพื้นฐานความรู้ที่นักพัฒนาเว็บแอปพลิเคชันต้องมีความเข้าใจอย่างลึกซึ้งเพราะเทคนิคเหล่านี้ถูกใช้ในการทำ authentication และ authorization บทความจะอธิบายเกี่ยวกับหลักการทำงานของ web session และ web cookie พร้อมทั้งความแตกต่างและวิธีการใช้งานอย่างถูกต้องปลอดภัย

ทบทวน HTTP (stateless protocol)

ก่อนจะทำความเข้าใจ web session เราต้องทบทวนหลักการทำงานเบื้องต้นของ HTTP ก่อน เนื่องจาก HTTP เป็น stateless protocol นั่นคือ ทุกครั้งที่ผู้ใช้งานเข้าเยี่ยมชมเว็บไซต์ เช่น blog.pathorn.net เว็บเบราเซอร์จะทำการสร้าง HTTP request ส่งไปขอข้อมูลจาก web server software (ตัวอย่างเช่น Apache HTTP server) หลังจากนั้น web server software ก็จะทำการส่งข้อมูลกลับมา (HTTP response) ให้กับเว็บเบราเซอร์ทำการแสดงผลให้กับผู้ใช้งาน เมื่อผู้ใช้งานกลับเข้ามาเยี่ยมชม blog.pathorn.net อีกครั้งหนึ่ง เบราเซอร์ก็จะทำการสร้าง HTTP request ส่งไปขอข้อมูลใหม่ โดย web server software ก็จะทำการส่งข้อมูลกลับมาให้กับเบราเซอร์ โดยที่ web  server software ไม่สนใจว่า HTTP request ครั้งที่ 1 และ HTTP request ครั้งที่ 2 นั้นมาจากผู้ใช้งานคนเดียวกันหรือไม่

ข้อจำกัดของ stateless protocol

เมื่อ HTTP เป็น stateless protocol ทำให้ web server software ไม่สามารถที่จะแยกแยะได้ว่า HTTP request แต่ละอันถูกส่งมาจากผู้ใช้งานคนไหน ทำให้เกิดปัญหาคือ

1.) ปัญหาการยืนยันตัวบุคคล (Authentication) ในการเข้าเยี่ยมชมเว็บไซต์บางหน้า เช่น หน้าที่ใช้ในการแก้ไขข้อมูลส่วนตัวของผู้ใช้งาน หรือหน้าที่ใช้ในการเรียกดูข้อมูลธุรกรรมการเงินของผู้ใช้งาน จะต้องมีการ login ก่อน หาก web server software ไม่สามารถระบุได้ว่า HTTP request นั้นถูกส่งมาจากผู้ใช้งานที่มีสิทธิ์ในการเข้าใช้งานหรือไม่ ก็ไม่สามารถตัดสินใจว่าควรจะข้อมูลให้กับผู้ใช้งานหรือไม่

2.) ความสะดวกสบายของผู้ใช้งาน ในบางกรณีเว็บไซต์อาจจะต้องการที่จะจดจำพฤติกรรมของผู้ใช้งาน ตัวอย่างเช่น เว็บขายของออนไลน์ หากผู้ใช้งานทำการเลือกสินค้าใส่ลงในตะกร้าเพื่อเตรียมสั่งซื้อ และเปลี่ยนหน้าไปดูเว็บไซต์อื่นก่อนเลือกชำระเงิน หากเว็บแอปพลิเคชันไม่สามารถจดจำได้ว่าผู้ใช้งานคนนี้เลือกสินค้าอะไรไป ผู้ใช้งานก็ต้องทำการเลือกสินค้าที่จะซื้อทุกอย่างภายในครั้งเดียว

ดังนั้น web session และ web cookie ถูกสร้างขึ้นมาเพื่อแก้ไขปัญหาดังกล่าวและสามารถนำไปประยุกต์ใช้ได้ในหลายกรณี

Web session คืออะไร

Web session คือเทคนิคที่ถูกคิดค้นขึ้นมาเพื่อให้ web server software สามารถแยกแยะได้ว่า HTTP request แต่ละอันที่ส่งมานั้น มาจากผู้ใช้งานคนไหน โดยหลักการทำงานของ Web session นั้นจะประกอบไปด้วย 2 ส่วนหลักนั้นคือ web browser (เช่น Chrome, Firefox, Safari) และ web server software (เช่น Apache HTTP server, Microsoft IIS, Tomcat Web Server) จะขออธิบายหลักการทำงานของ web session ด้วยขั้นตอนการ login ด้วย username และ password ที่สามารถพบได้ทั่วไป

1.) Web browser ทำการส่ง HTTP พร้อมข้อมูล username และ password ไปให้กับ web server software

2.) เว็บแอปพลิเคชันทำการตรวจสอบ username และ password ในฐานข้อมูล หากตรงกันก็จะทำการสั่งการให้ web server software ทำการจองพื้นที่ใน memory เพื่อใช้ในการเก็บข้อมูลผู้ใช้งาน พร้อมทั้งสร้าง session id (เป็น random string) ที่ใช้ในการระบุผู้ใช้งานคนนี้ (โดย session id ต้องถูกเก็บเป็นความลับ)

3.) web server software ทำการส่ง HTTP response กลับไปให้กับเว็บเบราเซอร์พร้อมกับ session id

Screen Shot 2559-01-10 at 3.56.09 PM

ดังนั้น เมื่อครั้งต่อไปที่ผู้ใช้งานคนเดินเข้ามเยี่ยมชมเว็บไซต์นี้อีกครั้ง เว็บเบราเซอร์ก็จะทำการส่ง session id มาพร้อมกับ HTTP request ทุกครั้งจนกว่า session จะหมดอายุ

จะเห็นได้ว่าการทำงานของ session ช่วยให้ผู้ใช้งานไม่จำเป็นต้องกรอก username และ password ในการยืนยันตัวบุคคลทุกครั้งที่กลับเข้ามา

อายุของ web session 

อายุของ web session ขึ้นอยู่กับการตั้งค่าของ web server software โดย session จะหมดอายุนั้นเกิดขึ้นได้ 2 กรณีคือ

1.) ผู้ใช้งานทำการปิดเว็บเบราเซอร์

2.) อายุของ session ใน memory ของ web server software หมดอายุ ในกรณีของ PHP บน Apache HTTP Server ผู้พัฒนาสามารถกำหนดอายุของ session ได้ที่ตัวแปร session.gc_maxlifetime ในไฟล์ php.ini โดย session ไม่ควรมีอายุนาน

การกำหนดอายุของ session นั้นมีส่วนสำคัญอย่างมากในเรื่องความปลอดภัยเพราะหาก session มีอายุนานเกินไป ก็อาจจะเพิ่มโอกาสให้กับผู้ไม่หวังดีในการหาทางขโมย session id จากผู้ใช้งานได้มากขึ้น ในทางกลับกันหาก session มีอายุสั้นเกินไปก็จะทำให้ user experience ในการใช้งานลดลง เนื่องจากผู้ใช้งานต้องทำการ login เพื่อยืนยันตัวบุคคลใหม่ ดังนั้น อายุของ session นั้นจะขึ้นอยู่กับประเภทของเว็บแอปพลิเคชันเป็นหลัก ตัวอย่างเช่น เว็บแอปพลิเคชันของธนาคารที่ใช้ในการทำธุรกรรมการเงิน อายุของ session จะสั้นมากประมาณ 15 นาที ถึง 1 ชั่วโมง ในทางกลับกัน หากเป็นเว็บแอปพลิเคชันประเภท forum session อาจมีอายุเป็นวัน เป็นเดือน หรือจนกว่าผู้ใช้งานจะปิดเบราเซอร์ เป็นต้น

ความสำคัญของ session id

จากการอธิบายรูปแบบการทำงานของ session ที่ได้กล่าวไปแล้วนั้นจะเห็นได้ว่า session id นั้นมีความสำคัญอย่างยิ่ง เพราะการรู้ session id หมายถึงการเป็นเจ้าของข้อมูลที่เก็บไว้ใน memory ของ web server software ดังนั้น การปกป้อง session id จึงมีความสำคัญอย่างมากต่อผู้ใช้งาน (ในอนาคตผมจะอธิบายถึงการทำ session hijacking ที่ผู้ไม่หวังดีใช้เทคนิคเพื่อขโมย session id ของผู้ใช้งานคนอื่น)

Web cookie คืออะไร

Web cookie คือเทคนิคของเว็บแอปพลิเคชันที่ใช้เก็บข้อมูลไว้ที่เว็บเบราเซอร์ของผู้ใช้งาน โดย web cookie นั้นมีลักษณะและแนวทางการใช้งานคล้ายกับ web session ยกเว้นแต่ว่าข้อมูลจะถูกเก็บไว้ที่เว็บเบราเซอร์ของผู้ใช้งานแทนที่จะเก็บไว้ใน memory ของ web server software จะขออธิบายการทำงานของ web cookie ด้วยขั้นตอนการ login ด้วย username และ password เพื่อที่จะได้สามารถเปรียบเทียบและเข้าใจความแตกต่างระหว่าง web cookie และ web session

1.) Web browser ทำการส่ง HTTP request พร้อมทั้ง username และ password ไปให้กับ web server software

2.) เว็บแอปพลิเคชันทำการตรวจสอบ username และ password ในฐานข้อมูล หากตรงกันให้เว็บแอปพลิเคชัน random string (ต่อไปนี้จะย่อว่า RS1) ขึ้นมาหนึ่งชุด (อันนี้ผู้พัฒนาเว็บแอปพลิเคชันต้องเขียนวิธีการสร้าง random string ขึ้นมาเอง ไม่เหมือน web session ที่ web server software จะทำในส่วนนี้ให้) และเก็บ RS1 นั้นลงในฐานข้อมูลพร้อมระบุว่า RS1 นี้เป็นของผู้ใช้งานคนไหน และทำการส่ง RS1 ให้กับเว็บเบราเซอร์

3.) เว็บเบราเซอร์ได้รับ RS1 มาก็ทำการเก็บข้อมูลลงใน file ที่ใช้สำหรับเก็บ web cookie ของเบราเซอร์

Screen Shot 2559-01-10 at 5.16.28 PM

ดังนั้นเมื่อครั้งต่อไปที่ผู้ใช้งานเข้าเยี่ยมชมเว็บไซต์เว็บเบราเซอร์ก็จะส่ง cookie id ไปให้กับเว็บแอปพลิเคชันในการตรวจสอบ cookie id ในฐานข้อมูลว่าตรงกันหรือไม่ หากตรงกันก็แปลว่าผู้ใช้งานคนนี้เคยทำการ login ด้วย username และ password  ในฐานข้อมูลดังกล่าว

ถึงตรงนี้หลายคนอาจจะเริ่มสงสัยแล้วว่า session กับ cookie ต่างกันตรงไหน เพราะขั้นตอนที่อธิบายมีความคล้ายกันมาก ดังนั้นเพื่อความเข้าใจที่มากขึ้นจะขอสรุปความแตกต่างของ web session และ web cookie เป็น 2 ข้อหลักดังนี้

1.) web session จะถูกลบไปจากเว็บเบราเซอร์ เมื่อผู้ใช้งานทำการปิดเบราเซอร์ แต่ web cookie จะไม่ถูกลบจนกว่าจะหมดอายุ ตัวอย่างเช่น หากผู้ใช้งาน login ด้วย username และ password แล้ว ถ้าเว็บไซต์เลือกใช้ session ในการยืนยันตัวบุคคล เมื่อผู้ใช้ทำการปิดเบราเซอร์และเปิดขึ้นมาเพื่อเข้าเว็บไซต์ ผู้ใช้งานต้องทำการ login ด้วย username และ password ใหม่ เนื่องจาก session id ถูกเก็บไว้ที่ memory ซึ่งถูกลบเมื่อปิดเบราเซอร์ แต่ในทางกลับกัน หากเว็บแอปพลิเคชันเลือกใช้ web cookie ข้อมูล cookie id ยังจะถูกเก็บไว้ใน file จนกว่าจะหมดอายุ ดังนั้น แม้ว่าผู้ใช้งานจะทำการปิดเบราเซอร์ไป และเปิดใหม่ขึ้นมา web cookie ก็ยังคงอยู่ ผู้ใช้งานไม่จำเป็นต้อง login ใหม่จนกว่า web cookie จะหมดอายุ

2.) ข้อมูลทุกอย่างของ web session ถูกเก็บไว้ใน memory ของ web server software แต่ข้อมูลทุกอย่างของ web cookie จะถูกเก็บไว้ที่เว็บเบราเซอร์ เว็บแอปพลิเคชันที่เรียกใช้งาน web session ข้อมูลทุกอย่างจะถูกเก็บไว้ที่ memory ของ web server software (เช่น Apache) เท่านั้นและส่ง sesion id ไปให้กับเว็บเบราเซอร์ ในทางกลับกัน เว็บแอปพลิเคชันที่เรียกใช้งาน web cookie สามารถเก็บข้อมูอะไรก็ได้ไม่ว่าจะเป็น username password cookie id ฯลฯ ใน cookie ของเว็บเบราเซอร์ของผู้ใช้งาน (ในตัวอย่างไม่ได้ส่ง username password ไปเก็บไว้ที่เบราเซอร์เนื่องจากไม่ปลอดภัยและไม่ควรทำอย่างยิ่ง เพราะเปิดโอกาสให้ข้อมูลมีการถูกโจรกรรมได้ง่าย นอกจากนี้การเก็บข้อมูลสำคัญไว้ใน cookie เปิดโอกาสให้ผู้ใช้งานอาจจะทำการแก้ไขข้อมูลได้อย่างอิสระ) 

เลือกใช้อะไรดีระหว่าง web session และ web cookie

ทั้ง web session และ web cookie ต่างมีข้อดีและข้อเสีย การเลือกใช้งานระหว่าง web session และ web cookie จึงขึ้นอยู่กับสถานะการณ์ไม่มีผิดถูก มีแต่เหมาะสมกับไม่เหมาะสม ดังนั้นเพื่อให้นักพัฒนาสามารถเลือกใช้ web session และ web cookie ได้เหมาะสม จะขอเสนอแนวทางในการเลือกใช้เป็นข้อ ๆ ดังนี้

1.) ไม่เก็บข้อมูลสำคัญที่เป็นความลับไว้ใน web cookie เนื่องจากข้อมูลใน cookie ของเว็บเบราเซอร์นั้นถูกเก็บอยู่ในรูปแบบของ file ที่ไม่ได้เข้ารหัสที่มีควมปลอดภัย ข้อมูลสำคัญอาจถูกโจรกรรมหรือแก้ไขได้

2.) ใช้ web cookie ในการอำนวยความสะดวกให้กับผู้ใช้งาน ตัวอย่างเช่น ในเว็บช็อปปิ้งออนไลน์ ผู้พัฒนาระบบอาจจะเลือกเก็บข้อมูลของสินค้าในตะกร้าไว้ใน web cookie เพื่ออนุญาตให้ผู้ใช้งานทำการเลือกซื้อสินค้าค้างไว้ได้โดยไม่จำเป็นต้องเริ่มต้นใหม่ทุกครั้งที่ปิดเบราเซอร์

3.) เลือกใช้ web session ในการยืนยันตัวบุคคลสำหรับข้อมูลที่สำคัญ เนื่องจาก web session มีอายุที่สั้นกว่า และข้อมูลทุกอย่างเก็บอยู่บน web server software memory ทำให้มีความปลอดภัยกว่า

ความจริงแล้วยังมีอีกหลายสถานการณ์ที่ web session และ web cookie สามารถใช้งานแทนกันได้ การใช้งาน web cookie และ web session ต้องใช้ประสบการณ์ในการพัฒนาเว็บแอปพลิเคชันเข้ามาช่วยในการตัดสินใจ


2 Comments

  • parichat larwongsa

    March 20, 2017

    อ่านเข้าใจง่ายดี ขอบคุณค่ะ

    Reply
  • เต้ย

    July 3, 2018

    ขอบคุณครับ

    Reply

Leave a Reply