Spring Security는 Spring Framework 기반의 보안 프레임워크로, 애플리케이션의 인증(Authentication) 및 권한 부여(Authorization) 기능을 제공
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(AbstractHttpConfigurer::disable) // CSRF 비활성화
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
) // jwt 사용을 위해 session 비활성화
.addFilterBefore(jwtAuthenticationFilter, SecurityContextHolderAwareRequestFilter.class) // jwt 필터 사용
.formLogin(AbstractHttpConfigurer::disable) // login 비활성화
.anonymous(AbstractHttpConfigurer::disable) // 익명 사용자 비활성화
.httpBasic(AbstractHttpConfigurer::disable) // 기본 인증 비활성화
.logout(AbstractHttpConfigurer::disable) // 로그아웃 비활성화
.rememberMe(AbstractHttpConfigurer::disable) // 권한 기억하기 기능 비활성화
.authorizeHttpRequests(auth -> auth
.requestMatchers(request -> request.getRequestURI().startsWith("/auth")).permitAll() // "/auth"의 경우 모든 사용자 접근 가능
.requestMatchers("/admin/**").hasAuthority(UserRole.Authority.ADMIN) // "ADMIN"권한을 가진 사용자만 접근 가능
.anyRequest().authenticated() // 그외 요청 인증 필요
)
.build();
}
🤔 왜 보안기능을 비활성화 할까?
CSRF : JWT 사용 시 불필요
세션 : JWT는 무상태(StateLess) 인증을 사용하기 때문에 session 불필요
폼 로그인/기본 인증 비활성화 → JWT를 사용 시 불필요
익명/로그아웃/기억하기 기능 비활성화 → JWT 인증 방식과 맞지 않음
인증 (Authentication)
session기반
의 UsernamePasswordAuthenticationToken을 사용@PreAuthorize
, @Secured
등을 사용하여 권한을 설정🤔
@PreAuthorize
vs@Secured
@Secured
: @Secured는 역할만 체크, 사용시ROLE_권한
형식으로 지정
@PreAuthorize
: 스프링 시큐리티의 표현식(SpEL, Spring Expression Language)을 사용할 수 있어 더 유연,hasRole()
을 사용할 경우 "ROLE_"을 생략
@Secured(UserRole.Authority.ADMIN)
@PatchMapping("/admin/users/{userId}")
public void changeUserRole(@PathVariable long userId, @RequestBody UserRoleChangeRequest userRoleChangeRequest) {
userAdminService.changeUserRole(userId, userRoleChangeRequest);
}
UserDetailsService
session 기반
의 security 적용PasswordEncoder
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
토큰 기반 인증 방식
서버가 세션을 저장하지 않고 인증📌 JWT방식 적용하기
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
📌 **기존 session제거**
```java
.formLogin(AbstractHttpConfigurer::disable)
.anonymous(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.logout(AbstractHttpConfigurer::disable)
.rememberMe(AbstractHttpConfigurer::disable)
📌 userRole를 리스트로 설정
public AuthUser(Long id, String email, UserRole role) {
this.id = id;
this.email = email;
this.authorities = List.of(new SimpleGrantedAuthority(role.name()));
}
@Secured
, @PreAuthorize
활용하여 권한 관리리스트
로 관리하여 확장성 고려