build.gradle)dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
}
SecurityConfig)@Configuration & @EnableWebSecurity: 이 클래스가 보안 설정 클래스임을 Spring에 알립니다.SecurityFilterChain Bean: HTTP 요청에 대한 보안을 처리하는 필터 체인을 정의합니다.authorizeHttpRequests: URL 경로별로 접근 권한을 설정합니다.requestMatchers(...).permitAll(): 특정 경로는 인증 없이 모두 접근 허용. (e.g., 회원가입, 로그인 API)anyRequest().authenticated(): 그 외 모든 요청은 반드시 인증된 사용자만 접근 허용.csrf(AbstractHttpConfigurer::disable): CSRF(Cross-Site Request Forgery) 보호 기능을 비활성화합니다. (Stateless한 JWT 방식에서는 일반적으로 비활성화)sessionManagement: 세션 관리 정책을 설정합니다. JWT를 사용할 것이므로, 세션을 생성하지 않는 STATELESS로 설정합니다.@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(authz -> authz
.requestMatchers("/api/auth/**").permitAll() // 회원가입/로그인 API는 허용
.anyRequest().authenticated()
);
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
// 비밀번호 암호화를 위한 BCryptPasswordEncoder
return new BCryptPasswordEncoder();
}
}
build.gradle)dependencies {
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
}
JwtTokenProvider)generateToken(): 사용자 정보를 받아 JWT를 생성합니다.validateToken(): 토큰의 유효성(서명, 만료 시간 등)을 검증합니다.getAuthentication(): 토큰에서 사용자 정보를 추출하여 Spring Security의 Authentication 객체를 생성합니다.JwtAuthenticationFilter)Authorization 헤더에서 Bearer 토큰을 추출합니다.JwtTokenProvider를 사용하여 토큰의 유효성을 검증합니다.JwtTokenProvider를 통해 Authentication 객체를 생성합니다.Authentication 객체를 SecurityContextHolder에 저장합니다.SecurityContextHolder: Spring Security가 현재 인증된 사용자의 정보를 저장하는 공간. 여기에 인증 정보가 저장되면, 해당 요청은 "인증된" 것으로 간주됩니다.SecurityConfig에서 UsernamePasswordAuthenticationFilter 앞에 추가하여, 모든 비즈니스 로직보다 먼저 JWT 인증이 수행되도록 설정합니다.// SecurityConfig에 필터 추가
.addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class)
회원가입 API:
PasswordEncoder를 사용하여 사용자의 비밀번호를 암호화하여 DB에 저장합니다.로그인 API:
passwordEncoder.matches()를 통해 비교합니다.JwtTokenProvider를 사용하여 Access Token과 Refresh Token을 생성하여 클라이언트에게 반환합니다.SecurityFilterChain Bean을 통해 세부적인 보안 규칙을 Java 코드로 설정합니다.JwtTokenProvider와, 모든 요청을 가로채 토큰을 검사하는 JwtAuthenticationFilter를 구현해야 합니다.SecurityContextHolder에 저장되어, 애플리케이션 전반에서 현재 로그인된 사용자를 식별하는 데 사용됩니다.