티스토리 뷰
[Spring Security - JWT] (1) : SecurityConfig 설정
evolutioning 2026. 4. 22. 20:11[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 설정 | 별도 구현 필요 |
- CSRF : JWT인증방식은 요청 헤더에 토큰을 담아 전송하기 때문에 CSRF의 공격 대상이 되지 않는다.
- 세션 : 세션기반은 서버가 로그인 상태를 유지해야 하기 때문에 ALWAYS로 설정하지만, JWT는 STATELESS로 설정한다.
- 로그인처리 : 세션기반은 FormLogin 형식을 사용해 로그인 URL / 핸들러를 지정했다. JWT방식은 JwtFilter에서 토큰을 검증한다.
- 로그아웃 : 세션기반은 세션 무효화 + 쿠키 삭제 방식으로 로그아웃하지만, JWT방식은 클라이언트에서 토큰을 삭제하는 방식으로 처리한다.
- 다중 로그인 : 세션기반은 MaximunSessions을 통해 동시 로그인 수를 제어할 수 있지만 JWT는 별도 구현이 필요하다.
이상으로 SecurityConfig.kt의 설정을 알아보았다.
다음 포스팅은 JWT 토큰 생성 및 검증을 담당하는 JWTUtil을 작성해보려 한다.
감사합니다.
'Spring > Security(JWT)' 카테고리의 다른 글
| [Spring Security - JWT] (5) : Refresh Token 구현 (0) | 2026.04.28 |
|---|---|
| [Spring Security - JWT] (4) : 로그인 API 및 Postman 테스트 (0) | 2026.04.27 |
| [Spring Security - JWT] (3) : JwtFilter (0) | 2026.04.24 |
| [Spring Security - JWT] (2) : JwtUtil (1) | 2026.04.24 |
| [Spring Security] 세션 기반 vs JWT 기반 (2) | 2026.04.21 |
- Total
- Today
- Yesterday
- 서버호스트
- Powershell
- Git
- 의존성
- Insert오류
- dependencies
- insert
- springsecurity
- 명령줄이 너무 깁니다
- spring ai
- 특일정보
- MariaDB
- securityconfig
- jwt
- kotlin
- JAR매니패스트
- AI
- 백엔드
- 게시판
- session저장
- null
- Column count doesn't match value count at row 1
- Postman
- Spring Security
- dbeaver
- gradle
- GitHub
- InetAddress
- ubuntu
- CRUD
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |