Spring Security เป็นเฟรมเวิร์กที่มีประสิทธิภาพสูงและยืดหยุ่นมากสำหรับการจัดการความปลอดภัยในแอปพลิเคชัน Java โดยเฉพาะอย่างยิ่งในระบบที่พัฒนาด้วย Spring Boot หน้าที่หลักของมันคือการควบคุม Authentication ( การยืนยันตัวตน ) และ Authorization ( การกำหนดสิทธิ์ ) เพื่อป้องกันการเข้าถึงทรัพยากรโดยไม่ได้รับอนุญาต
แนวคิดพื้นฐานที่ควรรู้
ก่อนจะเริ่มลงมือเขียนโค้ด มี 2 คำศัพท์สำคัญที่ต้องเข้าใจแยกจากกันให้ชัดเจน
- Authentication ( คุณคือใคร ? ): กระบวนการตรวจสอบว่าผู้ใช้งานคือคนที่เขากล่าวอ้างจริงหรือไม่ เช่น การกรอก Username และ Password หรือการใช้ Token
- Authorization ( คุณทำอะไรได้บ้าง ? ): เมื่อยืนยันตัวตนแล้ว ระบบจะตรวจสอบต่อว่าคุณมีสิทธิ์เข้าถึงหน้าเว็บหรือใช้งาน API เส้นนั้นหรือไม่ เช่น สิทธิ์ของ “Admin” เท่านั้นที่ลบข้อมูลได้
กลไกการทำงาน: Servlet Filter Chain
Spring Security ทำงานอยู่บนพื้นฐานของ Servlet Filters โดยสร้างชุดของ Filter ( เรียกว่า Security Filter Chain ) มาดักจับ Request ที่ส่งเข้ามายัง Server ก่อนที่จะไปถึง Controller ของเรา
- เมื่อมี Request เข้ามา มันจะผ่านดักตามลำดับ เช่น ตรวจสอบว่ามีการส่ง Token มาไหม, ตรวจสอบว่า Session หมดอายุหรือยัง, จนไปถึงขั้นสุดท้ายว่าสิทธิ์ที่มีอยู่นั้นอนุญาตให้เข้าถึง URL นี้หรือไม่
ฟีเจอร์หลักของ Spring Security
- Protection against exploits: ป้องกันการโจมตีพื้นฐานได้โดยอัตโนมัติ เช่น CSRF ( Cross-Site Request Forgery ), CORS ( Cross-Origin Resource Sharing ) และ Security Headers ต่าง ๆ
- Method Level Security: สามารถกำหนดสิทธิ์ในระดับฟังก์ชันได้เลย เช่น ใช้ Annotation
@PreAuthorize("hasRole('ADMIN')")บนหัว Method - OAuth2 / OpenID Connect: รองรับการทำ Login ผ่าน Social Media (Google, GitHub, Facebook) หรือระบบ Centralized Login ได้อย่างง่ายดาย
- SAML Support: สำหรับการทำ Single Sign-On (SSO) ในระดับองค์กร
ตัวอย่างการตั้งค่าเบื้องต้น ( Spring Boot 3.x )
ในเวอร์ชันปัจจุบัน เราจะใช้การสร้าง Bean ของ SecurityFilterChain เพื่อกำหนดค่าความปลอดภัย
src/main/java/com/example/demo/config/SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll() // อนุญาตให้ทุกคนเข้าถึง path นี้
.anyRequest().authenticated() // path อื่นๆ ต้อง Login ก่อน
)
.formLogin(Customizer.withDefaults()) // เปิดใช้งาน Login Form มาตรฐาน
.httpBasic(Customizer.withDefaults()); // รองรับ Basic Auth
return http.build();
}
}
การใช้ Spring Security ช่วยให้เราไม่ต้อง “สร้างโค้ทใหม่” ในเรื่องความปลอดภัยที่มีความซับซ้อนสูง และช่วยลดข้อผิดพลาดที่อาจนำไปสู่ช่องโหว่ร้ายแรงได้ อย่างไรก็ตาม ควรหมั่นอัปเดตเวอร์ชันและตรวจสอบการตั้งค่า ( Configuration ) ให้เหมาะสมกับประเภทของแอปพลิเคชันเสมอ