
บทนำ
หากคุณกำลังสร้างระบบ Backend ที่ให้ผู้ใช้ล็อกอินเข้ามาใช้งาน การออกแบบระบบ Authentication และ Authorization อย่างปลอดภัยถือเป็นหัวใจหลัก AWS มีบริการที่ช่วยคุณจัดการเรื่องนี้ได้ง่ายขึ้น คือ Amazon Cognito เมื่อผสานเข้ากับ API Gateway และ Lambda คุณก็จะได้ระบบยืนยันตัวตนแบบ Serverless ที่ปลอดภัยและขยายระบบได้ไม่จำกัด
1. สถาปัตยกรรมระบบ Authentication ด้วย Cognito
ระบบนี้ประกอบด้วย 3 ส่วนหลัก:
- Amazon Cognito User Pool — ใช้จัดการผู้ใช้และรหัสผ่าน
- API Gateway — เป็นจุดรับ API และเชื่อมกับ Authorizer
- Lambda Function — ใช้ประมวลผล Logic หลังผ่านการยืนยันตัวตนแล้ว

2. การสร้าง Cognito User Pool
ขั้นตอนแรกคือการสร้าง User Pool สำหรับเก็บข้อมูลผู้ใช้:
aws cognito-idp create-user-pool --pool-name MyUserPool
จากนั้น สร้าง App Client เพื่อให้ Frontend ใช้งานได้:
aws cognito-idp create-user-pool-client \
--user-pool-id \
--client-name MyWebClient \
--generate-secret
3. การสมัครและล็อกอินผู้ใช้ (SignUp / SignIn)
ตัวอย่างการสมัครผู้ใช้ใหม่:
aws cognito-idp sign-up \ --client-id \ --username [email protected] \ --password "MyStrongPassword123!"
หลังจากผู้ใช้ยืนยันอีเมลเรียบร้อย ก็สามารถล็อกอินเพื่อรับ Token:
aws cognito-idp initiate-auth \ --auth-flow USER_PASSWORD_AUTH \ --client-id \ --auth-parameters [email protected],PASSWORD=MyStrongPassword123!
ระบบจะคืนค่า Token 3 ส่วนคือ ID Token, Access Token, Refresh Token
4. การผสาน Cognito กับ API Gateway
สร้าง Cognito Authorizer ใน API Gateway เพื่อใช้ตรวจสอบ Token:
เมื่อเชื่อมต่อแล้ว ทุก Request ที่เข้ามาต้องแนบ Token มาด้วย เช่น:
curl -X GET https://api.example.com/dev/profile \
-H "Authorization: "
5. เขียน Lambda สำหรับ API ที่ต้องยืนยันตัวตน
ตัวอย่างโค้ด Lambda ด้วย Node.js ที่อ่านข้อมูลผู้ใช้จาก Token:
// handler.js
exports.handler = async (event) => {
const claims = event.requestContext.authorizer.claims;
const username = claims["cognito:username"];
return {
statusCode: 200,
body: JSON.stringify({
message: `สวัสดี ${username}, คุณเข้าสู่ระบบสำเร็จแล้ว!`
})
};
};
6. การตรวจสอบ Token ด้วย JWT
ทุก Token ของ Cognito เป็น JWT (JSON Web Token) ซึ่งสามารถตรวจสอบได้จาก public key ของ Cognito:
import jwt
import requests
POOL_ID = "ap-southeast-1_XXXXXXX"
REGION = "ap-southeast-1"
url = f"https://cognito-idp.{REGION}.amazonaws.com/{POOL_ID}/.well-known/jwks.json"
def verify_token(token):
jwks = requests.get(url).json()
header = jwt.get_unverified_header(token)
key = next(k for k in jwks['keys'] if k['kid'] == header['kid'])
return jwt.decode(token, key, algorithms=['RS256'], audience='your_client_id')
ฟังก์ชันนี้ช่วยให้คุณตรวจสอบความถูกต้องของ Token ก่อนอนุญาตให้เข้าถึง API
7. เพิ่ม Authorization ระดับ Role
ใน Cognito สามารถกำหนด Role ของผู้ใช้ได้ผ่านกลุ่ม (Groups) เช่น:
aws cognito-idp create-group \
--user-pool-id \
--group-name admin \
--description "Administrator group"
แล้วเพิ่มผู้ใช้เข้าไป:
aws cognito-idp admin-add-user-to-group \ --user-pool-id \ --username [email protected] \ --group-name admin
8. การทำงานแบบ Secure End-to-End
เมื่อผู้ใช้ล็อกอินสำเร็จ → ได้ Token → ส่ง API ผ่าน API Gateway → Authorizer ตรวจสอบ Token → Lambda ประมวลผล → ส่งกลับผลลัพธ์ ทั้งหมดนี้เกิดขึ้นโดยไม่ต้องมีเซิร์ฟเวอร์รันตลอดเวลา
9. สรุป
การใช้ Cognito + API Gateway + Lambda ทำให้เราสร้างระบบ Authentication/Authorization ได้ง่าย ปลอดภัย และขยายระบบได้โดยไม่ต้องดูแล Infrastructure เอง Developer สามารถใช้แนวทางนี้กับ React, Angular, หรือ Mobile App ได้ทันที
- ✅ ลดความซับซ้อนของการจัดการผู้ใช้
- ✅ ปลอดภัยตามมาตรฐาน AWS
- ✅ เชื่อมต่อกับบริการอื่นของ AWS ได้ง่าย
🧠 เขียนโดย King Pool
ภาพประกอบ: Cognito, Lambda, API Gateway, JWT Token
อ่านต่อ: การทำ Observability ด้วย CloudWatch, X-Ray และ Tracing