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 Security | Siro |
인증 방식 | 다양한 인증 방식 제공 | 기본적으로 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