IMCAT.DEV
로그인 가입
Java 고급 보안

Java Spring Security의 기초

Java Spring Security의 기초 — 고급

Spring Security의 기초

1. 도입 (왜 배워야 하는가)

Spring Security는 자바 기반의 웹 애플리케이션에서 인증(Authentication)과 인가(Authorization)를 처리하는 강력한 프레임워크입니다. 이 기술을 배우는 이유는, 현대의 웹 애플리케이션에서 보안은 필수적이며, 사용자 데이터 보호와 시스템 무결성을 유지하기 위해서는 적절한 보안 조치가 필요하기 때문입니다.

만약 Spring Security를 모른다면, 다음과 같은 문제가 발생할 수 있습니다:

  • 사용자 정보가 유출될 위험이 커집니다.
  • 악의적인 사용자가 시스템에 접근하여 데이터를 변경하거나 삭제할 수 있습니다.
  • 보안 취약점을 악용하는 공격에 노출될 수 있습니다.
  • 2. 핵심 개념 설명

    1. 인증(Authentication): 사용자가 누구인지 확인하는 과정입니다. 예를 들어, 은행에 가서 신분증을 보여주는 것과 같습니다.
    2. 인가(Authorization): 인증된 사용자가 어떤 자원에 접근할 수 있는지를 결정하는 과정입니다. 마치 집 열쇠를 가지고 있지만, 특정 방은 열 수 없는 것과 같습니다.
    3. 보안 필터 체인(Security Filter Chain): 요청이 들어올 때마다 실행되는 필터의 연속입니다. 요청을 처리하기 전에 보안 검사를 수행합니다.
    4. 용어설명
      인증사용자의 신원을 확인하는 과정
      인가인증된 사용자의 접근 권한을 확인하는 과정
      필터요청과 응답을 가로막아 보안을 적용하는 컴포넌트

      3. 기본 코드 예제

      Spring Security를 설정하기 위한 가장 기본적인 코드 예제를 살펴보겠습니다.

      import org.springframework.context.annotation.Configuration;
      import org.springframework.security.config.annotation.web.builders.HttpSecurity;
      import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
      import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
      
      @Configuration
      @EnableWebSecurity
      public class SecurityConfig extends WebSecurityConfigurerAdapter {
          @Override
          protected void configure(HttpSecurity http) throws Exception {
              http
                  .authorizeRequests()
                  .anyRequest().authenticated() // 모든 요청은 인증 필요
                  .and()
                  .formLogin(); // 기본 로그인 페이지 사용
          }
      }

      실행 결과

    5. 웹 애플리케이션에 접근할 때 로그인 페이지가 표시됩니다.
    6. 코드 한 줄씩 동작 설명

    7. @Configuration: 이 클래스가 Spring의 설정 파일임을 나타냄.
    8. @EnableWebSecurity: Spring Security의 설정을 활성화.
    9. protected void configure(HttpSecurity http): HTTP 요청에 대한 보안 설정을 정의하는 메서드.
    10. http.authorizeRequests(): 요청에 대한 접근 제어를 설정.
    11. anyRequest().authenticated(): 모든 요청은 인증이 필요하다고 설정.
    12. and().formLogin(): 기본 로그인 폼을 사용하도록 설정.
    13. 4. 실전 활용 예제

      예제 1: 특정 경로에 대한 접근 제한

      쇼핑몰 웹 애플리케이션에서 관리자 페이지는 일반 사용자에게 접근할 수 없어야 합니다.

      @Override
      protected void configure(HttpSecurity http) throws Exception {
          http
              .authorizeRequests()
              .antMatchers("/admin/**").hasRole("ADMIN") // /admin 경로는 관리자만 접근
              .anyRequest().authenticated()
              .and()
              .formLogin();
      }

      예제 2: JWT를 이용한 인증

      모바일 앱과의 통신에 JWT를 활용하여 인증을 처리할 수 있습니다.

      @Override
      protected void configure(HttpSecurity http) throws Exception {
          http
              .csrf().disable() // CSRF 보호 비활성화
              .authorizeRequests()
              .antMatchers("/api/public/**").permitAll() // 공개 API
              .anyRequest().authenticated()
              .and()
              .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); // 상태 비저장
      }

      5. 흔한 실수와 주의사항

    14. CSRF 보호 비활성화 시 주의: csrf().disable()을 사용하면 CSRF 공격에 노출될 수 있으므로, 꼭 필요한 경우에만 비활성화해야 합니다.
    15. - 잘못된 코드:

           http.csrf().disable(); // 모든 요청에 대해 CSRF 보호를 비활성화

      - 올바른 코드:

           http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); // CSRF 보호 유지
    16. 권한 체크 미비: 특정 경로에 대한 인가를 잘못 설정하면 보안이 취약해질 수 있습니다.
    17. - 잘못된 코드:

           .antMatchers("/admin/**").permitAll(); // 모든 사용자에게 관리자 접근 허용

      - 올바른 코드:

           .antMatchers("/admin/**").hasRole("ADMIN"); // 관리자만 접근 허용

      6. 정리

    18. Spring Security는 웹 애플리케이션의 보안을 강화하는 필수 프레임워크입니다.
    19. 인증과 인가는 사용자 보호를 위한 두 가지 핵심 요소입니다.
    20. 보안 필터 체인을 통해 요청에 대한 보안 검사를 수행합니다.
    21. 다음에 학습하면 좋은 주제:

    22. Spring Security와 JWT 통합
    23. OAuth2를 이용한 소셜 로그인 구현
    24. Spring Security의 커스터마이징 방법