스프링 시큐리티 JWT 이해를 위해 강의를 찾다가 유튜브 개발자유미님의 강의를 재밌게 들었다.
이런 강의가 공짜라니.. 다른것도 다 들어야징
아무튼 그 과정을 정리해보자!!
dependencies {
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'
}
@Controller
@ResponseBody
public class MainController {
@GetMapping("/")
public String mainP() {
return "main Controller";
}
}
@Controller
@ResponseBody
public class AdminController {
@GetMapping("/admin")
public String adminP() {
return "admin Controller";
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig {
// 2. SecurityConfig -> Spring Security 설정을 관리 하는 클래스
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// Spring Security의 보안 규칙을 정의하는 설정하는 filterChain 메서드
// 어떤 요청을 허용하고, 어떤 요청을 차단할지를 정하는 거지
// csrf disable , csrf(사이트 간 요청 위조) 방어 기능을 비활성화
// JWT는 무상태(stateless) 방식이기 때문에 csrf 공격을 막을 필요가 없다
// csrf가 뭔데!? 웹사이트가 사용자의 의도와 다르게 요청을 보내는 공격인데
// JWT는 세션을 사용하지 않아서 보호가 필요없어
http
.csrf((auth) -> auth.disable());
//Form 로그인 방식 disable
http
.formLogin((auth) -> auth.disable());
//http basic 인증 방식 disable
http
.httpBasic((auth) -> auth.disable());
//경로별 인가 작업
http
.authorizeHttpRequests((auth)->auth
.requestMatchers("/login","/","/join").permitAll() // 해당 경로 모든 사용자에게 허용
.requestMatchers("/admin").hasRole("ADMIN") // admin은 admin만 가능
.anyRequest().authenticated());// 그외의 요청은 인증이 필요
// 세션을 사용하지 않도록 설정 완전 중요 함 여기가!!
// STATELESS : 서버가 클라이언트의 세션을 저장하지 않음
// 요청마다 JWT를 보내서 인증해야 함
// 세션을 왜 안쓸까? 기존 로그인 방식은 서버가 세션을 유지하면서 로그인 정보를 관리했는데
// JWT 방식에서는 클라이언트가 JWT 토큰을 들고 다니면서 요청할 때마다 인증하는 거야
// 그래서 서버는 로그인 정보를 저장할 필요가 없고 STATELESS 모드로 설정하는 거지
http
.sessionManagement((session)->session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
return http.build();
}
}