
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
각 라이브러리의 역할은?
spring-boot-starter-security: Spring Security를 사용하여 인증, 권한 부여, 세션 관리 등 전반적인 보안 기능을 담당jjwt-api: JWT 토큰을 생성하고 검증하는 데 필요한 인터페이스와 기본 클래스들을 제공jjwt-impl: JWT 명세에 따른 실제 구현체를 제공jjwt-jackson: JWT 토큰의 클레임을 JSON으로 직렬화/역직렬화하는 기능을 제공spring-boot-starter-test: 테스트를 위한 의존성
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
// 비밀번호 암호화를 위한 Bean 등록
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
// CSRF 보호 비활성화 (JWT 사용 시 필요)
.csrf().disable()
// 기본 로그인 폼과 HTTP Basic 인증 비활성화
.formLogin().disable()
.httpBasic().disable()
// URL 접근 권한 설정
.authorizeHttpRequests(auth -> auth
.requestMatchers(
"/",
"/auth/**"
).permitAll() // 이 경로들은 모두 접근 가능
.requestMatchers("/admin").hasRole("ADMIN") // ADMIN 권한 필요
.anyRequest().authenticated() // 그 외 요청은 인증 필요
)
// 세션을 Stateless로 설정 (JWT 사용)
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
);
return http.build();
}
}
@Configuration과 @EnableWebSecurity
@Configuration: Spring의 설정 클래스임을 나타내는 어노테이션
@EnableWebSecurity
- Spring Security를 활성화하는 어노테이션
- 커스터마이징된 보안 설정을 적용하기 위해 반드시 포함
BCryptPasswordEncoder Bean
- 사용자 비밀번호를 암호화하기 위한 객체를 생성
- 비밀번호를 해시 방식으로 암호화하며, 복호화가 불가능하기 때문에 보안성이 높음
securityFilterChain 메서드
http .csrf().disable() .formLogin().disable() .httpBasic().disable() .authorizeHttpRequests(...) .sessionManagement(...);CSRF 보호 비활성화
CSRF는 주로 세션 기반 인증에서 문제가 되는데, JWT를 사용하면 세션을 사용하지 않기 때문에 비활성화해도 문제가 없음
기본 로그인 폼 및 HTTP Basic 인증 비활성화
- JWT 기반 인증을 사용할 경우, 클라이언트가 직접 토큰을 전송하므로 별도의 로그인 폼이 필요하지 않음
- HTTP Basic 인증은 JWT를 사용할 경우 필요하지 않으므로 비활성화
세션 관리 설정
SessionCreationPolicy.STATELESS
- 세션을 생성하지 않도록 설정
- 모든 요청에서 JWT 토큰을 통해 인증을 수행하며, 서버는 세션 정보를 유지하지 않음
반환값 http.build()
- Spring Security가 정의한 설정을 기반으로 SecurityFilterChain 객체를 생성해 반환
- 이 객체는 Spring Security 필터 체인에 등록되어 HTTP 요청을 처리
추가적으로 공부하며 계속 업데이트 해나갈 예정...✍🏻