ในการพัฒนาแอปพลิเคชันด้วย Spring Boot และต้องการจัดการเรื่องความปลอดภัย ( Authentication & Authorization ) เรามักจะเห็น Library หลัก 3 ตัวนี้ทำงานร่วมกันเสมอครับ แม้ว่าเราจะติดตั้งผ่าน spring-boot-starter-security เพียงตัวเดียว แต่เบื้องหลังมันประกอบด้วยส่วนประกอบที่ทำหน้าที่ต่างกันดังนี้ครับ
spring-security-core
นี่คือ “หัวใจ” ของระบบครับ มันประกอบด้วย API พื้นฐานและคลาสหลักที่ไม่ขึ้นตรงกับระบบ Web ( Non-web specific ) ทำให้สามารถนำไปใช้กับแอปพลิเคชันประเภท Desktop หรือ Method-level security ได้
- หน้าที่หลัก:
- Authentication: เก็บ Model ของผู้ใช้ เช่น
UserDetails,GrantedAuthority - Access Control: จัดการการตรวจสอบสิทธิ์ผ่าน
AccessDecisionManager - Security Context: คลาส
SecurityContextHolderที่ใช้เก็บข้อมูลผู้ใช้ที่ล็อกอินอยู่ในปัจจุบัน
- Authentication: เก็บ Model ของผู้ใช้ เช่น
- เหมาะสำหรับ: การทำ Unit Test หรือเขียน Logic ความปลอดภัยในระดับ Service layer
spring-security-web
ตัวนี้คือส่วนที่ทำให้ Security ทำงานบน HTTP Protocol ได้ครับ หากไม่มีตัวนี้ Spring Security ก็จะไม่รู้ว่าต้องจัดการกับ Request ที่วิ่งเข้ามาทาง Browser อย่างไร
- หน้าที่หลัก:
- Filters: หัวใจของมันคือ “Security Filter Chain” ( เช่น
UsernamePasswordAuthenticationFilter) - Infrastructure: จัดการเรื่องการทำ Redirect, การส่ง Error ( 401, 403 ), และการจัดการ Session /Cookies
- Firewall: คลาส
HttpFirewallที่ช่วยป้องกันการโจมตีพื้นฐานทาง URL
- Filters: หัวใจของมันคือ “Security Filter Chain” ( เช่น
- หัวใจสำคัญ: คลาส
HttpSecurityที่เราใช้กำหนดว่า URL ไหนต้องล็อกอิน หรือ URL ไหนให้ผ่านได้เลย จะทำงานอยู่ใน Module นี้ครับ
spring-security-config
ตัวนี้เปรียบเสมือน “กาว” หรือตัวเชื่อมครับ มันช่วยให้เราเขียน Code เพื่อตั้งค่า ( Configuration ) ได้ง่ายขึ้นผ่าน Syntax ที่อ่านง่าย ( Fluent API )
- หน้าที่หลัก:
- DSL ( Domain Specific Language ): ช่วยให้เราเขียน
http.authorizeHttpRequests(...).formLogin(...)ได้แบบไหลลื่น - Annotation Support: รองรับการใช้
@EnableWebSecurity,@EnableMethodSecurity - XML & Java Config: เป็นส่วนที่ประมวลผลการตั้งค่าทั้งหมดเพื่อไปสร้าง Bean ต่างๆ ใน Core และ Web
- DSL ( Domain Specific Language ): ช่วยให้เราเขียน
- ประโยชน์: ช่วยลดความซับซ้อนในการ Setup เพราะมันจะดึงเอาคลาสจาก Core และ Web มาประกอบร่างให้เราโดยอัตโนมัติ
สรุปความสัมพันธ์แบบเปรียบเทียบ
| Module | หน้าที่ | เปรียบเหมือน |
| core | นิยามว่า “ใคร” และ “ทำอะไรได้บ้าง” | กฎหมายและบัตรประชาชน |
| web | ดักจับ HTTP Request และจัดการ Session | ประตูกั้นและรปภ. หน้าตึก |
| config | วิธีการตั้งค่าระบบทั้งหมดเข้าด้วยกัน | คู่มือการติดตั้งและปุ่มควบคุม |
คำแนะนำเพิ่มเติม: ในการใช้งานจริงกับ Spring Boot คุณเพียงแค่ระบุ Dependency spring-boot-starter-security ในไฟล์ pom.xml หรือ build.gradle เพียงที่เดียว มันจะดึงทั้ง 3 ตัวนี้มาให้พร้อมใช้งานทันทีครับ
อ่านเพิ่มเติม