Spring Security + JWT 1

johaS2·2025년 2월 4일

스프링 시큐리티 JWT 이해를 위해 강의를 찾다가 유튜브 개발자유미님의 강의를 재밌게 들었다.
이런 강의가 공짜라니.. 다른것도 다 들어야징
아무튼 그 과정을 정리해보자!!

프로젝트 설정

  1. 필수 의존성
  • Lombok
  • Spring Web
  • Spring Security
  • Spring Data JPA
  • MySQL Driver
  1. 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'
}
  1. 기본 Controller 생성
@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";
    }
}

SecurityConfig 클래스

@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();
    }
}
profile
passionate !!

0개의 댓글