ABOUT ME

작은 디테일에 집착하는 개발자

Today
-
Yesterday
-
Total
-
  • [Spring Boot] 스프링 시큐리티
    네이버클라우드 캠프 | BE/Spring 2023. 6. 26. 00:16
    728x90

    이번 블로그 글에서는 로그인/로그아웃 기능을 구현하며 필수적으로 알아야 하는 Spring Security에 대해 알아보도록 하겠습니다.

     

    1. Spring Security

    Spring Security(스프링 시큐리티)는 웹 어플리케이션의 보안을 위한 강력한 프레임워크입니다.

    웹 어플리케이션에서 필요한 인증, 권한 부여를 비롯해 주요 보안 기능을 제공해, 어플리케이션을 안전하게 만들 수 있습니다.

     

    Spring Security는 아래와 같은 특징을 가지고 있습니다.

    1. 다양한 인증 방법 지원: *Form-Login, *LDAP, *OAuth 등 다양한 인증 방법 지원

    2. 권한 부여: 사용자별로 다른 권한을 부여하거나, URL/메서드 수준에서의 세밀한 권한 제어 가능

    3.  *CSRF 방지: CSRF 공격 방지를 위한 설정을 기본 제공

    *Form-Login 사용자가 웹 페이지의 로그인 폼에 아이디/비밀번호를 입력하여 인증하는 방식
    *LDAP 네트워크 프로토콜 중 하나로, 디렉터리 서비스를 조회하고 수정하는데 사용
    *OAuth 비밀번호 제공 없이, 자신의 정보를 안전하게 공유할 수 있게 하는 프로토콜 (예시: 카카오 로그인)
    *CSRF 웹 사이트의 취약점을 이용하여 의지와 무관하게 공격자가 의도한 행동을 하도록 만드는 공격 방식

     

    2. Spring Security의 주요 개념: 인증과 인가

    Spring Security는 인증(Authentication)과 인가(Authorization)의 두 가지 주요 프로세스를 통해 동작합니다.

     

    인증이란 사용자가 누구인지 확인하는 과정으로, 사용자의 아이디와 비밀번호 일치 여부를 확인합니다.

    인가사용자가 자원에 접근하거나 작업을 수행할 수 있는지 확인하는 과정으로,

    사용자 역할에 따라 접근할 수 있는 페이지와 기능이 달라집니다.

     

    Spring Security의 구체적인 사용 방법과 예제를 통해 Spring Security를 이해해 보도록 하겠습니다.

     

    3. Spring Security 적용

     

    3-1. 의존성 추가

    Spring Security를 사용하기 위한 첫 번째 단계는 프로젝트의 의존성에 Spring Security를 추가하는 것입니다.

    Maven 기반 프로젝트에서는 pom.xml 파일에 다음과 같이 의존성을 추가할 수 있습니다.

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

     

    3-2. Spring Security 설정

    이후 보안 설정을 위해 'SecurityConfig.java'라는 설정 파일을 작성해야 합니다.

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .and()
                .httpBasic();
        }
    }
    @Configuration
    @EnableWebSecurity
    Spring Security 설정 파일임을 명시
    extends WebSecurityConfigurerAdapter 웹 보안 설정을 위한 클래스 상속
    configure(HttpSecurity http) HTTP 요청에 대한 보안 설정하는 메서드
    위 예제는
    모든 요청(anyRequest())이 인증되어야 함(authenticated())을 명시하고,
    폼 로그인(formLogin())과 HTTP Basic 인증(httpBasic())을 사용하도록 설정하고 있습니다.

     

    3-3. 사용자 인증

    사용자 인증을 위해 UserDetailService 인터페이스를 구현(implements)한 클래스를 정의하고,

    PasswordEncoder를 함께 사용하는 것이 일반적입니다.

    @Service
    public class CustomUserDetailsService implements UserDetailsService {
    
        @Autowired
        private UserRepository userRepository;
    
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            User user = userRepository.findByUsername(username);
            if (user == null) {
                throw new UsernameNotFoundException("User not found");
            }
            return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());
        }
    }

     

    클래스는 Spring Security를 사용하여 사용자 인증 및 인가를 수행할 때 필요한 사용자 세부 정보를 제공하는 역할을 합니다.

    UserRepositiry userRepositiry 사용자 데이터를 데이터베이스에서 조회
    loadUserByUsername(String username) 사용자 이름을 받아 해당 사용자의 세부 정보를 조회
    UsernameNotFoundException Spring Security의 사용자 이름 부재 시 발생하는 표준 예외
    org.springframework.security.core.userdetails.User Spring Security에서 사용하는 표준 사용자 세부 정보 클래스
     
     
     
     

     

    💬 마무리

    웹 어플리케이션 보안은 무엇보다 중요합니다.

    Spring Security는 이러한 보안을 강력히 지원하며, 사용하기에도 상대적으로 쉽습니다.

    이번 포스팅을 통해 Spring Security의 개념과 사용 방법을 통해 어떻게 동작하는지 알아보았습니다.

     

    조금 더 Spring Security를 이해할 수 있도록 활용 예시를 추가하여 글을 보충하도록 할 테니... 지켜봐 주세요.

    감사합니다 :)

Designed by Tistory.