JWT jti claim คืออะไร


jti คือ unique JWT ID ใช้ป้องกันการ replay attack ในการใช้ JWT ที่ถูก revoke ไปแล้ว โดยทาง server จะต้องทำ cache หรือ database ในการเก็บ jti คู่กับ aud (client_id) ในการทำ blacklist JWT ไม่ให้สามารถ replay attack มาได้ โดย jti จะมีค่า exp และ iat ของตัวเองเก็บใน storage โดยตั้งให้มากกว่า exp claim ของ JWT เพื่อปิดช่องว่างเวลา ที่ hacker สามารถเอา JWT ไปใช้งานได้

โดยจะต้องระมัดระวังในเรื่อง performance ให้ดี เพราะว่า client จะต้องเรียกมาเช็ค blacklist JWT เพราะฉะนั้น บางเรื่องบาง feature ที่ต้องระมัดระวังเรื่อง security เท่านั้นควรใช้งาน หรือถ้า server เราเทพมากๆ ก็ใช้ทุกจุดได้เลย แต่มันก็ดูจะไม่ต่างจาก access_token แบบเก่าซักเท่าไร ที่ต้องมา hit server ทุก request

ตัวอย่าง jwt claim ของ keycloak system

{
  "jti": "d5b7bc5c-ec7d-4bbb-9d22-669ee07a7f2c",
  "exp": 1565756977,
  "nbf": 0,
  "iat": 1565755177,
  "iss": "http://192.168.99.100:8080/auth/realms/master",
  "aud": "http://192.168.99.100:8080/auth/realms/master",
  "sub": "1c7cdc50-e237-435e-a811-38bfb4cb7b2b",
  "typ": "Refresh",
  "azp": "security-admin-console",
  "auth_time": 0,
  "session_state": "c968be85-73b4-4e4e-b5eb-ed45193d09cb",
  "scope": "profile email"
}

azp คือ Authorized party ชื่อของ client ผู้สร้าง JWT
amr คือ Authentication Methods References ไม่มี standard สำหรับ amr value ใส่เองได้เลย เป็นค่าที่บอกว่า user login ด้วยวิธีไหน เช่น password,otp,pin,facerecog,qrcode

reference1 : https://auth0.com/blog/blacklist-json-web-token-api-keys/
reference2 : https://stackoverflow.com/questions/28907831/how-to-use-jti-claim-in-a-jwt

Posted in json web token (jwt) | Leave a comment

Segmentation Fault คืออะไร

Running Server อยู่หลายเดือนไม่มีปัญหา แต่อยู่ดีๆก็มีปัญหาขึ้นมา ปัญหาคือ
1.PHP Script ที่มีการใช้คำสั่ง curl จะมีปัญหาได้ 500 ทั้งหมด
2.ทดลองคำสั่ง curl ใน linux ได้ Segmentation Fault
3.ทดลองคำสั่ง yum install curl ได้ Segmentation Fault
และอีกหลายๆคำสั่ง

จากหลายๆที่อธิบาย Segmentation Fault หมายถึง Application มีการใช้งาน Memory อย่างไม่ถูกต้อง (Segfaults are caused by a program trying to read or write an illegal memory location.) ซึ่งผมก็หาทางแก้ทุกวิธี ทั้งเช็ค memory , swapfile ว่ามีเหลือเยอะอยู่หรือไม่ ด้วยคำสั่ง free -h และ clear page cache memory ด้วยคำสั่ง # sync; echo 1 > /proc/sys/vm/drop_caches. และยัง disable opcache ออกเพราะคิดว่าเป็นสาเหตุที่ใช้ memory ก็ยังไม่หาย

เหตุการณ์นี้ไปตรวจพบว่า มีคนยิงเว็บเราจากการดู Graph CPU , Disk Usage ขึ้นไป 60-70% และใช้คำสั่ง top ดู เลยไปหาที่มาจากการ tail error_log ใน apache ดู ก็พบว่า มี IP เดิมๆ ยิงเว็บเราอยู่ จึงทำการ block ip เหล่านั้นด้วยไฟล์ .htaccess หลังจากนั้น CPU ก็ลงไปที่เดิม

แต่ปัญหา Segmentation Fault ก็ยังไม่หาย และบางคำสั่งยังขึ้น Error Freeing read locks for locker อีกด้วยซึ่งเกี่ยวกับ memory address เช่นกัน สุดท้ายแก้ไม่ได้ ก็เลยลอง restart server ปรากฏว่าหาย สรุปสาเหตุมาจากการรับ Traffic ไม่ไหว จึงนำปัญหานี้มาแชร์ให้ฟังครับ

reference1 : https://kb.iu.edu/d/aqsj
reference2 : https://stackoverflow.com/questions/3200526/what-is-a-segmentation-fault-on-linux

Posted in centos6, knowledge | Leave a comment

Redux Thunk และ Redux Saga คืออะไร

Redux Thunk และ Redux Saga ทั้งคู่เป็น Middleware ให้กับ Redux มาช่วยจัดการ action ที่จะต้องการ return function เช่นต้องการ axios api ข้างนอกเพื่อมาทำ logic บางอย่างก่อน โดยทั่วไปก็จะต้องพบเจอและได้ใช้งาน โดยปกติ action ต้องการ return pure action แต่ในงานจริงเราต้องใช้ Middleware มาช่วยจัดการ


Redux Thunk จะเหมาะกับโปรเจ็คขนาดเล็ก ทำคนเดียว เทสยากเพราะ return promise


Redux Saga จะเหมาะกับโปรเจ็คขนาดใหญ่ ทำงานเป็นทีม มีการทำ unittest

Posted in react, redux | Leave a comment

ActiveRecord ต่างกับ Repository pattern ยังไง?

ActiveRecord Pattern ,Repository Pattern (Data Mapper pattern) คือวิธีการที่ใช้ต่อ Database ซึ่งใน Framework ต่างๆจะมีส่วนที่ใช้ ORM (Object Relational Mapping) โดยทั่วไปแล้วจะใช้อยู่ 2 Pattern

ตัวอย่าง ActiveRecord Pattern

Entity e = Entity.create();
e.setSomeField("abc");
e.save();

ตัวอย่าง Repository Pattern

Entity e = Entity.create();
e.setSomeField("abc");
repository.save(e);

ลักษณะโดยทั่วไป ActiveRecord Pattern

เขียนง่าย โค้ดน้อย ใช้เพียง 1 Entity class ต่อ 1 Table รวม business logic อยู่ใน Entity Class และ Entity Class รู้จักกับ Persistence Layer โดยตรง สังเกตจะเรียกคำสั่ง e.save() ได้เลย ส่วนใหญ่ PHP,Ruby Framework จะเลือก Pattern นี้โดย default

ลักษณะโดยทั่วไป Repository Pattern

แบ่งแยก Entity class ให้ไม่รู้จักกับ Persistence Layer โดยเพิ่ม Repository class เข้ามาเป็นส่วนของ Persistence Layer และย้าย business logic ออกไปที่ service layer เข้ามาจัดการเรื่อง Seperation of concern แยกสัดส่วนการทำงานอย่างชัดเจน ทำให้เขียน Unittest ได้ง่าย ส่วนใหญ่แล้ว C#,Java Spring จะเลือก Pattern นี้โดย default

และ TypeORM TypeORM – Amazing ORM for TypeScript and JavaScript ออกแบบมารองรับทั้ง 2 Pattern เลย

แล้วอะไรดีกว่ากัน?

Project งานที่เป็นระบบใหญ่ทำงานเป็นทีมใหญ่ อาจมีการเปลี่ยน Database Persistence Layer เช่น H2 หรือ sqllite เป็นการเรียกข้อมูล API แทน ให้เลือก Repository Pattern เพราะว่าได้มีการออกแบบแยกการทำงานเป็นสัดส่วน เราสามารถแก้ในส่วน Persistence Layer เป็นการเรียก API ได้ ในขณะที่ ActiveRecord ทำไม่ได้

Project งานที่ระบบเล็ก ทำคนเดียว ก็จะเหมาะกับ ActiveRecord เพราะต้องการความไวในการทำงาน ไม่ต้องมี Unittest และคงไม่มีการเปลี่ยน Database Persistence Layer ไปใช้ API เต็มที่ก็เปลี่ยน driver เช่นจาก MySQL เป็น Postgresql เป็นต้น

Posted in ไม่มีหมวดหมู่ | Leave a comment

MySQL Every derived table must have its own alias

หากมีการเปลี่ยน Database จาก Oracle เป็น MySQL และพบ Error นี้ในคำสั่ง findAll pageable ต่างๆ เป็นเพราะว่า MySQL required derived table เป็นเหมือนการเก็บ temporary table โดยตั้งชื่อไว้อ้างถึงภายหลัง ซึ่งไม่มีใน Oracle จึงทำให้เกิด error นี้ และใน sub-query ก็เช่นกันสำหรับ MySQL จะต้องตั้งชื่อโดยใส่ AS หรือมีชื่อในหลัง sub-query เสมอ

วิธีแก้ ให้เราเปลี่ยน hibernate.dialect เป็น org.hibernate.dialect.MySQL5Dialect

Posted in java, spring boot | Leave a comment