Bootcamp/Implementation 12

Spring Security에서 흔히 발생하는 문제와 해결 사례

💡 오늘 학습 키워드Spring Security에서 흔히 발생하는 문제 & 해결 사례 🎯 학습 내용 정리Spring Security를 처음 적용하면 기능 구현보다 오류를 해결하는 데 더 많은 시간을 보내는 경우가 많다.JWT를 정상적으로 발급했는데도 401 Unauthorized가 반환되거나, 인증이 완료되었는데 403 Forbidden이 발생하기도 한다. 또한 SecurityContextHolder에서 Authentication이 null로 조회되거나 hasRole()이 정상적으로 동작하지 않는 문제도 자주 발생한다.이러한 문제들은 대부분 Spring Security의 동작 원리를 충분히 이해하지 못한 상태에서 발생한다. 따라서 단순히 오류를 해결하는 것보다 왜 이런 현상이 발생하는지를 이해하..

Spring Security 전체 과정 흐름 추적

💡 오늘 학습 키워드Spring Security 전체 과정 흐름 추적 🎯 학습 내용 정리Spring Security를 처음 학습하면 SecurityFilterChain, JwtAuthenticationFilter, Authentication, SecurityContextHolder, AuthorizationFilter 등 다양한 구성 요소를 개별적으로 배우게 된다. 하지만 실제 요청이 들어왔을 때 이들이 어떤 순서로 동작하는지 한 번에 이해하기는 쉽지 않다. 예를 들어 다음과 같은 의문이 생길 수 있다.JWT는 언제 검증될까?Authentication은 언제 생성될까?SecurityContextHolder에는 누가 저장할까?@PreAuthorize는 언제 실행될까?Controller에서는 어떻게..

Refresh Token

💡 오늘 학습 키워드Refresh Token 🎯 학습 내용 정리JWT 기반 인증을 처음 구현하면 Access Token 하나만으로 인증을 처리해도 충분해 보인다. 하지만 Access Token의 유효 시간을 길게 설정하면 토큰이 탈취되었을 때 장기간 악용될 수 있고, 반대로 유효 시간을 너무 짧게 설정하면 사용자는 자주 로그인을 다시 해야 하는 불편함을 겪게 된다.이러한 문제를 해결하기 위해 등장한 방식이 Access Token과 Refresh Token을 함께 사용하는 구조이다.Access Token은 짧은 수명을 가지며 API 인증에 사용되고, Refresh Token은 긴 수명을 가지며 새로운 Access Token을 발급받는 용도로만 사용된다. 왜 Refresh Token이 필요할까?A..

CORS와 CSRF

💡 오늘 학습 키워드CORSCSRF 🎯 학습 내용 정리Spring Security를 처음 적용하면 가장 먼저 작성하는 설정 중 하나가 다음 코드이다.http .csrf(AbstractHttpConfigurer::disable) .cors(Customizer.withDefaults());많은 개발자가 이 설정을 관례처럼 복사하여 사용하지만, 왜 필요한지 정확히 이해하지 못하는 경우가 많다.특히 JWT 기반 인증에서는 대부분 CSRF를 비활성화하는데, 이를 "JWT를 사용하니까 무조건 CSRF를 끄면 된다."라고 이해하는 것은 정확하지 않다. CSRF는 인증 정보를 브라우저가 자동으로 전송하는 방식과 관련된 공격이고, CORS는 브라우저의 동일 출처 정책(Same-Origin Policy..

AuthenticationEntryPoint와 AccessDeniedHandler 예외 처리

💡 오늘 학습 키워드AuthenticationEntryPointAccessDeniedHandler 🎯 학습 내용 정리Spring Security를 적용하면 인증 또는 권한과 관련된 문제가 발생했을 때 자동으로 HTTP 상태 코드를 반환한다.인증되지 않은 사용자가 보호된 API에 접근하면 401 Unauthorized가 반환되고, 인증은 되었지만 권한이 부족한 사용자가 접근하면 403 Forbidden이 반환된다.많은 개발자는 이 두 응답을 단순히 상태 코드의 차이로만 이해하지만, Spring Security 내부에서는 서로 다른 예외가 발생하며, 각각을 처리하는 컴포넌트도 다르다. 예외 처리 방식을 이해하기 위해서는 먼저 인증과 인가를 구분해야 한다.인증(Authentication)은 사용자가..

AuthenticationManager와 AuthenticationProvider

💡 오늘 학습 키워드AuthenticationManagerAuthenticationProvider 🎯 학습 내용 정리Spring Security에서 로그인 기능을 구현하다 보면 AuthenticationManager, AuthenticationProvider, UserDetailsService를 설정하게 된다. 하지만 대부분의 개발자는 AuthenticationManager.authenticate()만 호출한 채 내부에서 어떤 객체가 인증을 수행하는지까지는 살펴보지 않는 경우가 많다.실제로 AuthenticationManager는 직접 인증을 수행하지 않는다. 인증을 수행할 수 있는 여러 AuthenticationProvider에게 인증을 위임하고, 적절한 Provider가 사용자의 자격 증명을..

UserDetails와 UserDetailsService

💡 오늘 학습 키워드UserDetailsUserDetailsService 🎯 학습 내용 정리Spring Security를 사용하다 보면 UserDetails, UserDetailsService, AuthenticationProvider와 같은 인터페이스를 자연스럽게 접하게 된다. 처음에는 단순히 Spring Security가 요구하는 인터페이스이기 때문에 구현한다고 생각하기 쉽다.하지만 내부 동작을 이해하면 UserDetails와 UserDetailsService는 단순한 규약이 아니라 Spring Security와 애플리케이션의 도메인 모델을 연결하는 핵심 계층이라는 것을 알 수 있다. 로그인 인증 과정에서 UserDetails는 언제 사용될까?사용자가 로그인을 요청하면 Spring Secu..

Authentication과 SecurityContextHolder

💡 오늘 학습 키워드AuthenticationSecurityContextHolder 🎯 학습 내용 정리Spring Security를 처음 학습하면 Authentication, SecurityContext, SecurityContextHolder라는 객체를 자주 접하게 된다. JWT 인증을 구현하면서도 다음과 같은 코드를 한 번쯤 작성하게 된다.SecurityContextHolder.getContext() .setAuthentication(authentication);이 코드 한 줄만으로 Spring Security는 현재 요청을 인증된 사용자로 인식하고, Controller에서는 @AuthenticationPrincipal을 통해 로그인한 사용자의 정보를 바로 사용할 수 있다. 하지..

JWT 기반 로그인 구현과 Access Token 발급

💡 오늘 학습 키워드JWT 기반 로그인 구현 & Access Token 발급 🎯 학습 내용 정리로그인은 어떻게 동작할까?Spring Security를 처음 사용하면 로그인 API를 직접 구현하는 것이 다소 낯설 수 있다.기존 Session 기반 인증에서는 Spring Security가 /login 요청을 자동으로 처리하지만, JWT 기반 인증에서는 로그인 API를 직접 구현해야 한다. 로그인 과정은 다음과 같은 순서로 진행된다.Client ↓ ID / PasswordController ↓AuthenticationManager ↓UserDetailsService ↓PasswordEncoder ↓Authentication 생성 ↓JwtProvider ↓Access Token 발급 ↓C..

Spring Security 구조 설계

💡 오늘 학습 키워드Spring Security 구조 설계 🎯 학습 내용 정리Spring Security를 처음 적용할 때 가장 많이 하는 고민 중 하나는 Security 관련 코드를 어디에 위치시켜야 하는가이다.프로젝트 규모가 작은 경우에는 config, filter, jwt, service 등을 하나의 패키지에 모두 작성하기도 한다. 하지만 프로젝트가 점점 커질수록 인증(Authentication), 인가(Authorization), JWT, Filter 등이 하나의 패키지에 섞여 유지보수가 어려워진다.이번에서는 도메인 중심 구조(Domain-Oriented Package Structure) 를 유지하면서 Security 또한 하나의 독립적인 인프라 영역으로 설계하였다. Spring Secu..