ข้อ 3 การเรียก api จาก app จะต้องมี signature ส่งไปด้วย
signature = SHA256(
accessToken = (userId::clientId) = ใครทำ
endpoint = ทำอะไร
parameters = ทำอย่างไร
nonce = ทำเมื่อไหร่
appId = เรียกจาก app ไหน
==============================
secret = token ลับ
)
.
.
nonce คือเวลาปัจจุบันของ client
ซึ่งจะต้องส่งไปที่ server พร้อมกับ parameter อื่นๆ
ฝั่ง server ตรวจสอบ ถ้า current_time() - GMT(nonce) > 2 นาที
request จะถูก reject เพื่อกัน replay attack
.
.
secret มีประโยชน์ ถึงแม้จะใช้ https ก็ตาม
ถ้า hacker ดักเอา accessToken คนอื่นมาได้
ก็จะปลอมเป็นคนอื่นไม่ได้ถ้าไม่รู้ secret
.
secret จะไม่ส่งทาง network เด็ดขาด
จะฝังไว้ใน app เมื่อ compile แต่ละ version
ถ้า secret ถูกโขมยไปได้จะต้อง update app ใน store
โดย app version เดิมทั้งหมด จะใช้ไม่ได้
ก็ต้องยอม ก็ดันโดนโขมย secret นี่นา
เห็นมั้ยว่าต้องคิดในทางเลวร้ายที่สุดเผื่อไว้ด้วย
.
.
การเรียก api จาก mobile app จะมีข้อดีกว่า web
คือไม่สามารถปลอม request ได้เลย
ถึงแม้จะใช้ accessToken ของตัวเองในการยิง api
เนื่องจากไม่รู้ secret ที่ฝังไว้ใน app
.
.
อย่างไรก็ตาม server ห้ามเชื่อใน request โดยไม่ตรวจค่าอื่นๆ
เนื่องจาก web app สามารถยิง api ได้ด้วย accessToken
โดยไม่ต้องมี secret ลับ
เพราะ web app จะไม่มี secret และถึงอยากมี secret ก็มีไม่ได้
มีไปก็ถูก copy เอาไปใช้อยู่ดี เพราะใช้ javascript เปลือยๆ
.
.
ข้อ 4 เมื่อเรียก api จาก web app จะต้องใส่ accessToken ใน header
อย่าริอาจเอา accessToken ใส่ไว้ใน URL
เนื่องจาก accessToken มันก็คือรหัสผ่านดีๆนี่เอง
URL บางทีก็โดน history ไว้ใน browser
URL บางทีก็โดน copy ส่งให้เพื่อน
และทุกครั้ง URL ก็จะโดน log ไว้เป็น file ไว้ใน server
รอเวลา hacker แหกด่าน server เข้ามาเจอ log เข้าสักวัน
.
.
ข้อ 5 จะต้องมี CSRF_token ใน cookie
ซึ่งต้องถูก generate ใส่เอาไว้มาจากฝั่ง server
CSRF_token อันนี้สำคัญมาก ถ้าไม่มีนี่โจมตีง่าย
แต่ผลกระทบของ CSRF attack นี่รุนแรง
มีไว้เอามาใช้ทำอะไรไปดูที่ข้อ 6
.
.
ข้อ 6 การเรียก api จาก web app จะต้องมี signature ส่งไปด้วย
signature = SHA256(
accessToken = (userId::clientId) = ใครทำ
endpoint = ทำอะไร
parameters = ทำอย่างไร
nonce = ทำเมื่อไหร่
appId = web
================================
secret = CSRF_token
)
signature ต่างกับ mobile app ตรงที่ appId = web เสมอ
และ secret ก็คือ CSRF_token
เอาไว้กัน Cross Site Request Forgery
แปลเป็นไทยคือ web อื่นจะมายิง api ของเว็บเราไม่ได้
เพราะว่า web อื่นจะมองไม่เห็น cookie ของเว็บเรา
ดังนั้นถึงปลอม parameters ได้ แต่ก็ปลอม signature ไม่ได้
เพราะต้องใช้ CSRF_token ในการสร้าง
.
.
ยังมีอีกเยอะที่ต้องทำ แต่ 6 ข้อนี้เป็นจุดเริ่มต้นของทุกสิ่ง