Hello

스프링 시큐리티(Spring Security) vs 전통적인 방식

by 볼빵빵오춘기

과거 회원가입, 로그인 할 때에는 전통적인 방식을 구현했지만, 요즘은 Spring Security와 OAuth2.0을 사용한다. 

전통적인 방식과 스프링 시큐리티가 무엇인지 알아보자!

 

전통적인 방식

회원가입

  • 클라이언트에서 서버로 정보 전달
    ⇒ 사용자가 회원가입 폼에 정보를 입력하고 이를 서버로 전송한다.
  • 서버에서 데이터 처리 및 저장
    ⇒ 서버는 받은 정보를 데이터베이스에 저장한다.
    이 때, 비밀번호는 암호화되지 않은 상태로 저장되는 경우가 많았다.

로그인

  • 클라이언트에서 서버로 정보 전달
     사용자가 로그인 폼에 ID와 비밀번호를 입력하고 이를 서버로 전송한다.
  • 서버에서 인증
     서버는 데이터베이스에 저장된 사용자 정보와 입력된 정보를 비교하여 인증을 처리한다.

 

전통적인 방식의 주요 특징

  • 평문 비밀번호 저장
    사용자의 비밀번호를 암호화하지 않고 그대로 데이터베이스에 저장하는 경우가 많다. 이는 데이터베이스가 유출될 경우, 사용자의 비밀번호가 그대로 노출되는 심각한 보안 문제를 초래한다.
  • 세션 관리
    • 사용자가 로그인에 성공하면 서버는 세션을 생성하고, 세션 ID를 쿠키에 저장하여 클라이언트에 전달한다.
      이후 요청마다 클라이언트는 세션 ID를 서버에 보내어 인증을 받는다.
    • 세션 관리는 서버 메모리에 부담이 되고, 세션 탈취 등의 보안 이슈가 존재할 수 있다.
  • 비효율적인 접근 제어
    각 요청에 대해 접근 권한을 일일이 수작업으로 확인하는 방식이었다. 이로 인해 접근 제어 정책이 일관되지 않거나 누락되는 경우가 발생할 수 있다.

 

스프링 시큐리티(Spring Security)

  • 스프링 기반의 애플리케이션에서 보안을 담당하는 강력한 프레임워크이다.
    주로 웹 애플리케이션에서 인증(Authentication)과 권한 부여(Authorization)를 처리하는 데 사용한다.
  • Spring Security는 다양한 보안 기능을 제공하며, 대표적으로 인증, 권한 부여, 보안 설정, 기타 보안 기능, 커스터마이징 및 확장성 기능을 포함한다.
  • Spring Security는 스프링 애플리케이션에서 보안에 대한 많은 부분을 처리해주므로, 개발자는 보다 안전하고 신뢰할 수 있는 애플리케이션을 구축할 수 있다.

 

기능

인증 (Authentication)

  • 사용자가 누구인지 확인하는 과정이다.
  • 주요 인증 방식으로는 폼 기반 인증, HTTP 기본 인증, HTTP Digest 인증, OAuth 등이 있다.
  • 사용자 정보는 일반적으로 데이터베이스, LDAP, 인메모리 등의 저장소에서 관리된다.
  • Spring Security는 사용자의 인증을 관리하기 위해 AuthenticationManager 인터페이스와 다양한 AuthenticationProvider 구현체들을 제공한다.
  • 인증에 성공하면 인증된 사용자는 Principal 객체를 통해 접근할 수 있다.

 

권한 부여 (Authorization)

  • 인증된 사용자가 특정 리소스 또는 기능에 접근할 수 있는 권한을 결정하는 과정이다.
  • 보통 Access Control List (ACL)이나 권한 계층 구조(Role Hierarchy)를 사용하여 권한을 관리한다.
  • @PreAuthorize, @Secured, @RolesAllowed 등의 애노테이션을 사용하여 메소드나 URL에 대한 접근 제어를 설정할 수 있다.

 

보안 설정 (Security Configuration)

  • Spring Security는 보안 관련 설정을 위한 다양한 기능을 제공한다.
  • Java 설정 클래스나 XML을 이용하여 필터 체인 설정을 통해 보안을 적용할 수 있다.
  • CSRF(Cross-Site Request Forgery) 방어, 세션 관리, 로그인/로그아웃 처리 등의 기능을 제공한다.

 

기타 보안 기능

  • 인증 실패 처리, 세션 관리, 동시 세션 제어, Remember-Me 기능(자동 로그인), 인증 이벤트 처리 등 다양한 보안 관련 기능을 지원한다.
  • 다양한 인증 제공자(Provider)를 지원하여 LDAP, OAuth, OpenID 등 다양한 인증 방식을 연동할 수 있다.

 

커스터마이징 및 확장성

  • Spring Security는 다양한 커스터마이징 기능을 제공하여 프로젝트의 특정 요구사항에 맞게 보안 정책을 세밀하게 조정할 수 있다.
  • 필터 체인을 확장하거나 커스텀 필터를 추가하여 보안 로직을 세부적으로 제어할 수 있다.

 

기본 설정 예시

의존성 추가

pom.xml에 Spring Security 의존성을 추가한다.

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

 

보안 설정 클래스

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/main").permitAll() // '/','/main' 페이지는 누구나 접근 가능
                .anyRequest().authenticated() 
                .and()
            .formLogin()
                .loginPage("/login") // 사용자 정의 로그인 페이지
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(); // 비밀번호 암호화
    }
}
  • 루트 (/)와 홈 (/home) 페이지는 누구나 접근 가능하다.
  • 그 외의 모든 요청은 인증이 필요하다.
  • 사용자 정의 로그인 페이지 (/login)를 넘긴다.
  • BCryptPasswordEncoder를 사용하여 비밀번호를 암호화하였다.

 

사용자 서비스 구현 예시

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 실제로는 DB에서 사용자 정보를 조회하여 반환
        if ("user".equals(username)) {
            return org.springframework.security.core.userdetails.User
                    .withUsername(username)
                    .password(new BCryptPasswordEncoder().encode("password"))
                    .roles("USER")
                    .build();
        } else {
            throw new UsernameNotFoundException("User not found");
        }
    }
}

 

 

정리하자면

  • 인증과 권한 부여: 사용자의 신원을 확인하고, 특정 리소스에 대한 접근 권한을 제어한다.
  • 구성 및 설정: XML이나 Java 클래스를 통해 보안 정책을 정의한다.
  • 추가 보안 기능: CSRF 보호, 세션 관리, CORS 설정 등 다양한 보안 기능 제공한다.

✅ Spring Security는 매우 유연하고 강력하여 다양한 보안 요구 사항을 충족할 수 있다.

 기본적인 설정부터 고급 설정까지, 다양한 방법으로 애플리케이션을 보호할 수 있다.

 


참고링크

https://dev.gmarket.com/45

https://www.elancer.co.kr/blog/view?seq=235

https://velog.io/@cyseok123/Spring-Security

 

내 정리 참고 링크

https://luckygirljinny.tistory.com/category/%EA%B0%95%EC%9D%98%20%EB%94%B0%EB%9D%BC%ED%95%98%EA%B8%B0/Security1

 

 

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기