728x90

Introduction

Spring Security는 애플리케이션 보안에 대한 표준 기능을 제공하는 프레임워크입니다. 최근 Spring Security 5.7 버전이 출시되면서 이전 버전과 다른 점이 몇 가지 있다는 것을 알아보겠습니다. 또한, Spring Security와 Siro의 차이점과 기능 및 성능 비교에 대해서도 알아볼 것입니다.

Spring Security와 Siro 차이점 및 기능, 성능 비교

Spring Security와 Siro는 모두 보안 프레임워크입니다. 그러나 두 프레임워크는 목적이 다릅니다. Spring Security는 다양한 인증 및 권한 부여 방식을 제공하며, Siro는 주로 RBAC(Role-Based Access Control)를 지원합니다. 또한, Spring Security는 많은 기능을 제공하며, 설정이 복잡할 수 있습니다. 반면, Siro는 간단한 설정으로 사용할 수 있지만, 기능이 제한될 수 있습니다. 성능 측면에서도 Spring Security가 더 우수합니다.

다음은 Spring Security와 Siro의 기능 및 성능을 비교한 표입니다.

Spring SecuritySiro
인증 방식다양한 인증 방식 제공기본적으로 Form 인증
권한 부여 방식다양한 권한 부여 방식 제공주로 RBAC 지원
설정의 복잡성높음낮음
기능많음제한적
성능우수보통

Spring Security 5.7 이후 버전 설정 방법 및 예시 코드

다음은 Spring Security 5.7 이전 버전에서 JWT 인증을 사용하는 방법의 예시 코드입니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtTokenFilter jwtTokenFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/api/**").authenticated()
            .and()
            .addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());
    }

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
        daoAuthenticationProvider.setUserDetailsService(userDetailsService());
        daoAuthenticationProvider.setPasswordEncoder(passwordEncoder());
        return daoAuthenticationProvider;
    }

    @Bean
    public UserDetailsService userDetailsService() {
        return new InMemoryUserDetailsManager(
            User.builder()
                .username("user")
                .password(passwordEncoder().encode("password"))
                .roles("USER")
                .build()
        );
    }
}

5.7 이후 버전 아래 형식으로 바뀜

참고: https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter

@Configuration
public class SecurityConfiguration {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
        return http.build();
    }
		@Bean
		    public WebSecurityCustomizer webSecurityCustomizer() {
		        return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");
		    }

}

Postman으로 JWT 토큰 발급 과정 구체적인 코드 작성

Postman을 사용하여 JWT 토큰 발급을 구현하기 위해서는 먼저 Spring Security 설정에서 JWT 인증을 사용해야 합니다. JWT 토큰을 생성하고 발급하는 방법은 다음과 같습니다.

@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {

    Authentication authentication = authenticationManager.authenticate(
            new UsernamePasswordAuthenticationToken(
                    loginRequest.getUsername(),
                    loginRequest.getPassword()
            )
    );

    SecurityContextHolder.getContext().setAuthentication(authentication);

    String jwt = tokenProvider.generateToken(authentication);
    return ResponseEntity.ok(new JwtAuthenticationResponse(jwt));
}

MySQL DB 설정과 application.yml 파일 설정

Spring Boot에서는 application.yml 또는 application.properties 파일을 사용하여 애플리케이션 설정을 관리합니다. MySQL DB를 사용하는 경우, application.yml 파일은 다음과 같이 설정할 수 있습니다.

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/dbName
    username: dbUser
    password: dbPassword
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

ORM으로 JPA 사용하기

Spring Boot에서는 JPA를 사용하여 ORM(Object-Relational Mapping)을 구현할 수 있습니다. JPA는 Java Persistence API의 약자로, 객체와 관계형 데이터베이스 간의 매핑을 처리합니다. JPA를 사용하는 경우, 다음과 같이 의존성을 추가하고, Entity 클래스를 작성하고, Repository 인터페이스를 작성하면 됩니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    // getters and setters
}

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

Conclusion

Spring Security 5.7 이후 버전에서는 여러 개선 사항이 추가되어 있습니다. 또한, Spring Security와 Siro의 차이점과 기능 및 성능 비교를 통해 각각의 장단점을 알아봤습니다. JWT 토큰 발급 과정과 MySQL DB 설정, JPA 사용 방법에 대해서도 자세히 알아보았습니다. 이를 토대로 Spring Security를 보다 효율적으로 사용할 수 있을 것입니다.


내저장소 바로가기 luxury515

'Springboot3.0 > 핵심기능' 카테고리의 다른 글

Spring의 핵심요소  (0) 2023.04.15
Spring IoC 에 관하여.  (0) 2023.04.15
Redis를 이용한 refresh token  (0) 2023.04.11
Redis를 이용한 중복요청 방지  (0) 2023.04.11
Springboot3.0 에서 kafka적용해보기  (0) 2023.04.11

+ Recent posts