ป้ายกำกับ: Level

Spring Boot: Spring SecuritySpring Boot: Spring Security

Spring Security เป็นเฟรมเวิร์กที่มีประสิทธิภาพสูงและยืดหยุ่นมากสำหรับการจัดการความปลอดภัยในแอปพลิเคชัน Java โดยเฉพาะอย่างยิ่งในระบบที่พัฒนาด้วย Spring Boot หน้าที่หลักของมันคือการควบคุม Authentication ( การยืนยันตัวตน ) และ Authorization ( การกำหนดสิทธิ์ ) เพื่อป้องกันการเข้าถึงทรัพยากรโดยไม่ได้รับอนุญาต


แนวคิดพื้นฐานที่ควรรู้

ก่อนจะเริ่มลงมือเขียนโค้ด มี 2 คำศัพท์สำคัญที่ต้องเข้าใจแยกจากกันให้ชัดเจน

  1. Authentication ( คุณคือใคร ? ): กระบวนการตรวจสอบว่าผู้ใช้งานคือคนที่เขากล่าวอ้างจริงหรือไม่ เช่น การกรอก Username และ Password หรือการใช้ Token
  2. 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 ) ให้เหมาะสมกับประเภทของแอปพลิเคชันเสมอ