AWS DVA-C02
Esc
↑↓เลื่อน↵เปิดescปิด28 ผลลัพธ์
24

Amazon Cognito

Authentication & federated identity

Foundations & Identity 10 นาที 21 คำถาม

01ภาพรวม Amazon Cognito

Amazon Cognito คือบริการจัดการ identity สำหรับ web/mobile app ช่วยให้ผู้ใช้ภายนอก (external users) ลงทะเบียนและล็อกอินได้แบบ serverless โดยไม่ต้องดูแล server เอง แตกต่างจาก IAM ที่ออกแบบสำหรับ user ภายในองค์กร (จำนวนหลักร้อย) ส่วน Cognito รองรับ user นับล้านได้

Cognito แบ่งเป็น 2 บริการหลักที่มักสับสนกันในข้อสอบ และมัก ใช้ร่วมกัน เป็น chain

  • Cognito User Pools (CUP) = serverless user directory ทำหน้าที่ authentication (sign-up/sign-in) และออก JWT tokens
  • Cognito Identity Pools (CIP / Federated Identities) = แลก identity/token เป็น temporary AWS credentials ผ่าน STS เพื่อเข้าถึง AWS resources โดยตรง
  • Cognito Sync = sync ข้อมูล user preferences ข้ามอุปกรณ์ — ปัจจุบัน deprecated (ใช้ AWS AppSync แทน)
Tips สำหรับการสอบ
จำประโยคทอง: CUP ออก JWT (authentication), CIP ออก AWS credentials (authorization) ข้อสอบ DVA-C02 ชอบถามว่าควรใช้บริการไหนตาม scenario ถ้าโจทย์พูดถึง login/sign-up เลือก CUP ถ้าพูดถึงเข้าถึง S3/DynamoDB โดยตรงจาก client เลือก CIP

02Cognito User Pools (CUP) - Authentication

Cognito User Pools (CUP) เป็น serverless user directory ที่จัดการ database ของผู้ใช้สำหรับ web/mobile app รองรับ sign-up/sign-in ทั้งแบบ username/password และผ่าน external IdP เมื่อ login สำเร็จ CUP จะออก JWT tokens กลับมา

ฟีเจอร์หลักของ User Pools

  • รองรับ simple login (username/email + password)
  • Password policy กำหนดความยาวขั้นต่ำและประเภทตัวอักษร (uppercase/lowercase/number/special)
  • MFA (Multi-Factor Authentication) รองรับ SMS และ TOTP (software token)
  • Email & phone number verification
  • รองรับ federation กับ Social (Google/Facebook/Amazon/Apple), OIDC และ SAML
  • Hosted UI หน้า login/sign-up สำเร็จรูป
  • Lambda triggers รันโค้ด custom ในจังหวะต่างๆ ของ auth flow
  • Account takeover protection / Adaptive authentication (Advanced Security)
หมายเหตุ
CUP integrate ได้กับ API Gateway และ Application Load Balancer (ALB) โดยตรง เพื่อ offload การ authenticate user ออกจาก backend

03JWT Tokens: ID / Access / Refresh

เมื่อ authenticate กับ CUP สำเร็จ จะได้ JWT (JSON Web Tokens) 3 ประเภท ซึ่งข้อสอบชอบถามความแตกต่างของหน้าที่และอายุ

ID Token
มี claims เกี่ยวกับ identity ของผู้ใช้ (เช่น email, name, sub) ใช้พิสูจน์ว่าผู้ใช้คือใคร ดีฟอลต์มีอายุ 1 ชั่วโมง มักใช้กับ API Gateway Cognito authorizer
Access Token
ใช้ authorize การเข้าถึง resources / OAuth 2.0 scopes (เช่นเรียก Resource Server) ดีฟอลต์มีอายุ 1 ชั่วโมง
Refresh Token
อายุยาวที่สุด ใช้ขอ ID/Access token ใหม่โดยไม่ต้อง login ซ้ำ ดีฟอลต์ 30 วัน ตั้งได้สูงสุดถึง 10 ปี
Tokenหน้าที่หลักอายุ default
ID tokenidentity ของ user (claims)1 ชั่วโมง
Access tokenauthorize resource / OAuth scopes1 ชั่วโมง
Refresh tokenขอ token ใหม่ ไม่ต้อง login ซ้ำ30 วัน (สูงสุด 10 ปี)
กับดักข้อสอบ
JWT token จาก CUP ไม่ใช่ AWS credentials จึงเรียก AWS API (S3/DynamoDB) โดยตรงไม่ได้ ถ้าต้องการเข้าถึง AWS resources ต้องนำ token ไปแลกเป็น temporary credentials ผ่าน Identity Pool + STS ก่อน

04Hosted UI, App Clients & Lambda Triggers

Hosted UI เป็นหน้าเว็บ sign-in/sign-up สำเร็จรูปที่ AWS host ให้ ปรับแต่ง logo และ CSS ได้ ใช้ custom domain ได้ (ต้องมี ACM certificate ใน us-east-1) และรองรับ social/SAML/OIDC federation ในตัว ช่วยลดงานสร้าง frontend authentication

App Client คือ entity ที่ represent แต่ละแอปที่เชื่อมกับ User Pool กำหนด config เช่น token validity, allowed OAuth flows & scopes, callback/logout URLs และ client secret (สำหรับ server-side app — ไม่ควรใช้ใน public/SPA/mobile)

Lambda Triggers ที่พบบ่อย

  • Pre Sign-up / Pre Authentication — validate ก่อนสมัคร/ก่อน login
  • Post Confirmation / Post Authentication — ทำงานหลังยืนยัน/login สำเร็จ
  • Custom Message — customize ข้อความ verification/MFA
  • Pre Token Generation — เพิ่ม/แก้ claims ใน token
  • Migrate User — ย้าย user จาก directory เดิมแบบ on-the-fly
Tips สำหรับการสอบ
ถ้าโจทย์ถามว่าจะ เพิ่ม custom claims เข้าไปใน token หรือ validate ข้อมูลก่อน sign-up คำตอบคือ Lambda trigger (Pre Token Generation / Pre Sign-up)

05Federation: Social / OIDC / SAML

CUP ทำหน้าที่เป็น identity broker ให้ผู้ใช้ login ด้วย external IdP โดยที่ CUP ยังคงเป็นตัวออก JWT token กลางให้แอปใช้งาน — แอปจึงไม่ต้องเขียนโค้ดต่อ IdP แต่ละราย

  • Social federation — Google, Facebook, Amazon, Apple (เหมาะกับ consumer app)
  • OIDC federation — IdP ที่รองรับ OpenID Connect
  • SAML 2.0 federation — corporate directory เช่น ADFS, Okta (เหมาะกับพนักงานองค์กร SSO)
หมายเหตุ
แม้ user จะ login ผ่าน Google หรือ corporate SAML แต่ CUP ก็ยังออก JWT มาตรฐานของ Cognito ให้ ทำให้ฝั่งแอปจัดการ token แบบเดียวไม่ว่ามาจาก IdP ไหน

06Cognito Identity Pools - AWS Credentials

Cognito Identity Pools (Federated Identities) ทำหน้าที่แลก identity (token จาก CUP, social IdP, SAML, OIDC หรือแม้แต่ developer-authenticated) เป็น temporary, limited-privilege AWS credentials ผ่าน STS (AssumeRoleWithWebIdentity) เพื่อให้ client เข้าถึง AWS resources โดยตรง เช่น S3, DynamoDB

Authenticated vs Guest

  • Authenticated identities — user ที่ login แล้ว ได้ IAM role ที่กำหนดสิทธิ์มากกว่า
  • Unauthenticated (guest) identities — user ที่ยังไม่ login ได้ guest IAM role ที่จำกัดสิทธิ์ (เช่น เข้าถึงข้อมูลสาธารณะ)

Identity Pool จะกำหนด default IAM roles แยกสำหรับ authenticated และ unauthenticated และรองรับ Role Mapping เพื่อเลือก role ตาม claim ของ user

Rules-based role mapping
เลือก IAM role ตาม value ของ claim ใน token (เช่น ถ้า email ลงท้ายด้วย @admin.com ให้ admin role)
Token-based role mapping
ใช้ claim cognito:roles และ cognito:preferred_role จาก token เพื่อกำหนด role

07IAM Role Mapping & Policy Variables

จุดแข็งของ Identity Pool คือทำ fine-grained access control ให้ user แต่ละคนเข้าถึงเฉพาะ resource ของตัวเองได้ โดยใช้ IAM policy variables ร่วมกับ identity id โดยไม่ต้องสร้าง role ต่อ user

ตัวอย่าง: จำกัดให้ user เข้าถึงเฉพาะ S3 prefix ที่ตรงกับ identity ของตน ด้วยตัวแปร ${cognito-identity.amazonaws.com:sub}

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": [
        "arn:aws:s3:::my-bucket/${cognito-identity.amazonaws.com:sub}/*"
      ]
    }
  ]
}

สำหรับ DynamoDB ใช้ condition dynamodb:LeadingKeys เพื่อจำกัด row-level access ตาม identity id

json
{
  "Effect": "Allow",
  "Action": ["dynamodb:GetItem", "dynamodb:Query", "dynamodb:PutItem"],
  "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MyTable",
  "Condition": {
    "ForAllValues:StringEquals": {
      "dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"]
    }
  }
}
กับดักข้อสอบ
ห้าม ฝัง IAM access key ระยะยาวในแอป mobile เด็ดขาด ถ้าโจทย์ถามวิธี secure ให้ mobile app เข้า AWS resources คำตอบที่ถูกคือ Identity Pool + temporary credentials จาก STS เสมอ

08Integration: API Gateway & ALB

CUP integrate กับ service หน้าบ้านได้เพื่อ offload การ authenticate ก่อนถึง backend

API Gateway

ใช้ Cognito User Pools authorizer ที่ติดมากับ API Gateway เพื่อ validate JWT token อัตโนมัติ โดยไม่ต้องเขียน Lambda authorizer เอง — ง่ายและไม่ต้องดูแลโค้ด ถ้าต้องการ logic ซับซ้อนกว่านั้นค่อยใช้ Lambda authorizer

Application Load Balancer (ALB)

ALB รองรับ listener rule action authenticate-cognito ที่เชื่อมกับ CUP (หรือ OIDC IdP ผ่าน authenticate-oidc) เพื่อบังคับ user login ก่อนเข้าถึง target — เป็นการ authenticate ที่ระดับ load balancer

บริการหน้าบ้านวิธี integrate กับ CUPข้อดี
API GatewayCognito User Pools authorizervalidate JWT ในตัว ไม่ต้องเขียนโค้ด
API GatewayLambda authorizerยืดหยุ่น custom logic ได้เต็มที่
ALBaction authenticate-cognitoauthenticate ที่ระดับ LB ไม่แตะ backend
Tips สำหรับการสอบ
ถ้าโจทย์ต้องการ validate Cognito JWT ที่ API Gateway แบบ ไม่ต้องเขียน code ให้เลือก Cognito User Pools authorizer ไม่ใช่ Lambda authorizer

09CUP vs CIP และการใช้ร่วมกัน

ความสับสนระหว่าง User Pools กับ Identity Pools คือหัวข้อที่ออกสอบบ่อยที่สุด ต้องแยกหน้าที่ให้ชัด และเข้าใจว่ามัก ใช้ร่วมกันเป็น chain

หัวข้อCognito User Pools (CUP)Cognito Identity Pools (CIP)
หน้าที่Authentication (ใครคือ user)Authorization (เข้าถึง AWS อะไรได้)
ผลลัพธ์ที่ได้JWT tokens (ID/Access/Refresh)Temporary AWS credentials (ผ่าน STS)
เป็นServerless user directoryToken exchange / credential broker
เข้าถึง AWS resource ตรงๆไม่ได้ได้ (S3/DynamoDB ฯลฯ)
รองรับ guestไม่ใช่จุดประสงค์หลักรองรับ unauthenticated (guest) role

flow เมื่อใช้ร่วมกัน

  • 1. User login ที่ CUP (หรือผ่าน social/SAML) → ได้ JWT token
  • 2. แอปส่ง JWT นั้นเป็น login ให้ Identity Pool
  • 3. CIP เรียก STS AssumeRoleWithWebIdentity → ได้ temporary AWS credentials
  • 4. แอปใช้ credentials เข้าถึง AWS resources (เช่น S3, DynamoDB) ตาม IAM role
หมายเหตุ
สรุปสั้น: CUP จัดการว่า user เป็นใคร, CIP จัดการว่า user ทำอะไรกับ AWS ได้บ้าง ทั้งสองทำงานต่อกันเป็น authentication-to-authorization pipeline

10Cognito Sync (Deprecated) & สรุปกับดักข้อสอบ

Cognito Sync เคยใช้ sync ข้อมูล user preferences/state ข้ามอุปกรณ์ ปัจจุบัน deprecated AWS แนะนำให้ใช้ AWS AppSync แทนสำหรับ data synchronization ในข้อสอบถ้าเห็น Cognito Sync เป็นตัวเลือกของ scenario สมัยใหม่ มักเป็นตัวลวง

สรุปกับดักข้อสอบที่พบบ่อย

  • สับสนหน้าที่ CUP (JWT) vs CIP (AWS credentials) — จำให้แม่น
  • คิดว่า JWT token เรียก AWS API ได้โดยตรง — ไม่ได้ ต้องแลกผ่าน CIP/STS
  • เลือก Lambda authorizer ทั้งที่ Cognito User Pools authorizer ก็พอ
  • ฝัง long-term IAM key ใน mobile app แทนที่จะใช้ temporary credentials
  • เลือก Cognito Sync ในโจทย์ data sync สมัยใหม่ (ควรเป็น AppSync)
Tips สำหรับการสอบ
keyword mapping เร็วๆ: 'sign-up/login/JWT' → CUP, 'temporary AWS credentials/เข้า S3 จาก client/guest access' → CIP, 'fine-grained per-user S3/DynamoDB' → policy variables ${cognito-identity.amazonaws.com:sub}, 'authenticate ที่ ALB' → authenticate-cognito

คำถามทบทวน

ทดสอบความเข้าใจหัวข้อ Amazon Cognito

21 ข้อ · เลือกคำตอบเพื่อดูเฉลยและคำอธิบาย

ทำแล้ว 0/21คะแนน 0
  1. 1.แอปพลิเคชันต้องการให้ผู้ใช้ลงทะเบียนและล็อกอินด้วย username/password โดยไม่ต้องดูแล server เอง และต้องการ JWT token เพื่อยืนยันตัวตน ควรใช้บริการใด?

  2. 2.หลังจาก User Pool authenticate สำเร็จ แอปต้องการ temporary AWS credentials เพื่อให้ user เข้าถึง S3 bucket โดยตรง ควรทำอย่างไร?

  3. 3.token ใดของ Cognito User Pool ที่มีอายุยาวที่สุดและใช้สำหรับขอ token ใหม่โดยไม่ต้อง login ซ้ำ?

  4. 4.ต้องการให้ user login ผ่าน Google และ Facebook โดยไม่เก็บ password ใน directory ของตัวเอง ควรตั้งค่าอะไรใน CUP?

  5. 5.ต้องการ validate JWT token จาก Cognito User Pool ที่ API Gateway โดยไม่ต้องเขียน custom code ควรใช้ authorizer แบบใด?

  6. 6.ต้องการรันโค้ดเพื่อ validate หรือแก้ไขข้อมูลผู้ใช้ก่อนยืนยันการสมัครสมาชิก (sign-up) ควรใช้ฟีเจอร์ใดของ CUP?

  7. 7.ใน Identity Pool ต้องการให้ user เข้าถึงเฉพาะ S3 prefix ที่ตรงกับ identity ของตัวเองเท่านั้น ควรใช้อะไรใน IAM policy?

  8. 8.แอปต้องการให้ผู้ใช้ที่ยังไม่ login (guest) เข้าถึงข้อมูลสาธารณะใน AWS ได้แบบจำกัด ควรตั้งค่าอะไรใน Identity Pool?

  9. 9.ข้อใดอธิบายความแตกต่างหลักระหว่าง Cognito User Pools และ Identity Pools ได้ถูกต้องที่สุด?

  10. 10.บริการ Cognito ใดที่ถูก deprecated และแนะนำให้ใช้ AWS AppSync แทน?

  11. 11.ต้องการหน้า login/sign-up สำเร็จรูปที่ AWS host ให้โดยไม่ต้องสร้าง UI เอง ควรใช้อะไร?

  12. 12.Application Load Balancer (ALB) ต้องการ authenticate user ก่อนส่ง request ไป target ควร integrate กับอะไร?

  13. 13.token ใดของ CUP ที่ควรใช้ในการเรียก Resource Server / API ที่มี OAuth 2.0 scopes?

  14. 14.app client ใน CUP มีหน้าที่หลักคืออะไร?

  15. 15.องค์กรใช้ Active Directory และต้องการให้พนักงาน login เข้าแอปด้วย corporate credentials ผ่าน Cognito ควรตั้งค่า federation แบบใด?

  16. 16.เมื่อ Identity Pool มีหลาย IdP และต้องการเลือก IAM role ตาม claim ใน token (เช่น group) ควรใช้อะไร?

  17. 17.ต้องการบังคับให้ user ทุกคนตั้ง password อย่างน้อย 8 ตัวอักษร มีตัวเลขและตัวพิมพ์ใหญ่ ควรตั้งค่าที่ไหน?

  18. 18.flow การทำงานเมื่อใช้ CUP + CIP ร่วมกันเรียงลำดับอย่างไร?

  19. 19.ต้องการเพิ่มความปลอดภัยให้ login ของ CUP ด้วยรหัส OTP จาก SMS หรือ TOTP app ควรเปิดใช้อะไร?

  20. 20.แอป mobile ต้องการ access DynamoDB table โดยให้แต่ละ user เห็นเฉพาะ items ของตัวเอง วิธีที่ปลอดภัยและ scalable ที่สุดคือ?

  21. 21.ข้อใดเป็นกับดักข้อสอบที่พบบ่อยเกี่ยวกับ Cognito?