티스토리 뷰

https://ekeprl.tistory.com/62

 

[Spring Security] 세션 기반 vs JWT 기반

https://ekeprl.tistory.com/30 Spring Security (1)Spring boot : 3.1Spring Security6Kotlin Spring security의 방식에 대해선 다루지않고, 어떻게 작성했는지를 다루도록 하려한다. 1. Build.gradle.ktsdependencies { //spring-secutiry (

ekeprl.tistory.com

 

이전 포스팅을 통해 세션기반 인증 vs JWT기반 인증을 비교했다.

 

이번 포스팅은 실전으로 들어가 JWT인증방식을 사용한 Spring Security 설정을 시작하려고 한다.

 

1. build.gradle.kts

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-security")
}

가장 먼저 Security 의존성을 추가한다.

 

2.SecurityConfig.kt 작성

--JWT기반 인증
@Configuration
@EnableWebSecurity
class SecurityConfig(
    private val jwtFilter: JwtFilter
) {

    @Bean
    fun filterChain(http: HttpSecurity): SecurityFilterChain {
        return http
            .csrf { it.disable() }      //JWT는 세션기반이 아니라 CSRF는 DISABLE
            .sessionManagement {
                it.sessionCreationPolicy(SessionCreationPolicy.STATELESS)   //세션을 유지하지않고 토큰으로만 인증
            }
            .authorizeHttpRequests {
                it.requestMatchers("/auth/**").permitAll()                // 로그인, 회원가입만 인증없이 접근가능
                    .anyRequest().authenticated()
            }
            .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter::class.java)       //JWTFilter 등록(spring security 필터앞에 미리)
            .build()
    }

    @Bean
    fun passwordEncoder(): PasswordEncoder {
        return BCryptPasswordEncoder()
    }
}

우선 JWT기반 인증을 위한 SecurityConfig.kr의 코드

--세션 기반 인증
@Bean
fun filterChain(http: HttpSecurity): SecurityFilterChain {
    return http.csrf {
            csrf -> csrf.csrfTokenRepository(HttpSessionCsrfTokenRepository())
        .ignoringRequestMatchers("/login")
        .ignoringRequestMatchers("/login-try")
    }.sessionManagement {
        it.sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
            .maximumSessions(1)
            .maxSessionsPreventsLogin(true)
    }.formLogin {
        it.loginPage("/login").permitAll()
            .usernameParameter("userid")
            .passwordParameter("userpw")
            .loginProcessingUrl("/security-login-try").permitAll()
            .successHandler(authenticationSuccessHandler)
            .failureHandler(authenticationFailureHandler)
    }.authorizeHttpRequests {
        it.requestMatchers("/login", "/join", "/resources/**").permitAll()
            .anyRequest().authenticated()
    }.logout {
        it.logoutUrl("/logout").permitAll()
            .logoutSuccessUrl("/login")
            .invalidateHttpSession(true)
            .deleteCookies("SESSION", "JSESSIONID", "XSRF-TOKEN")
    }.build()
}

다음은 지난 포스팅에 작성했던 세션기반 인증을 위한 SecurityConfig.kt의 코드

 

 

3. 차이점

                                                                          세션 기반                                                              JWT 기반

CSRF 활성화 (세션 쿠키 사용) 비활성화 (토큰 사용)
세션 정책 ALWAYS (세션 유지) STATELESS (세션 없음)
로그인 처리 formLogin, SuccessHandler JwtFilter에서 처리
로그아웃 세션 무효화, 쿠키 삭제 클라이언트에서 토큰 삭제
다중 로그인 제어 maximumSessions 설정 별도 구현 필요

 

  1. CSRF : JWT인증방식은 요청 헤더에 토큰을 담아 전송하기 때문에 CSRF의 공격 대상이 되지 않는다.
  2. 세션    : 세션기반은 서버가 로그인 상태를 유지해야 하기 때문에 ALWAYS로 설정하지만, JWT는 STATELESS로 설정한다.
  3. 로그인처리 : 세션기반은 FormLogin 형식을 사용해 로그인 URL / 핸들러를 지정했다. JWT방식은 JwtFilter에서 토큰을 검증한다.
  4. 로그아웃 : 세션기반은 세션 무효화 + 쿠키 삭제 방식으로 로그아웃하지만, JWT방식은 클라이언트에서 토큰을 삭제하는 방식으로 처리한다.
  5. 다중 로그인 : 세션기반은 MaximunSessions을 통해 동시 로그인 수를 제어할 수 있지만 JWT는 별도 구현이 필요하다.

 

이상으로 SecurityConfig.kt의 설정을 알아보았다.

다음 포스팅은 JWT 토큰 생성 및 검증을 담당하는 JWTUtil을 작성해보려 한다.

 

감사합니다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함