📝 Remember Me 인증 세션이 만료되고 웹 브라우저가 종료된 후에도 어플리케이션이 사용자를 기억하는 기능 Remember-Me 쿠키에 대한 Http 요청을 확인한 후 토큰기반 인증을 사용해 유효성을 검사 후 토큰이 검증되면 사용자가 로그인 된다. http.rememberMe() // remember 기능 작동 package kyh.security.basicsecurity; @Configuration @EnableWebSecurity @RequiredArgsConstructor public class SecurityConfig extends WebSecurityConfigurerAdapter { private final UserDetailsService userDetailsService; @Over..
| Logout 처리 http.logout() : 로그아웃 기능 작동 http.logout() // 로그아웃 처리 .logoutUrl("/logout") // 로그아웃 처리 URL .logoutSuccessUrl("/login") // 로그아웃 성공 후 이동페이지 .deleteCookies("JSESSIONID“, "remember-me") // 로그아웃 후 쿠키 삭제 .addLogoutHandler(logoutHandler()) // 로그아웃 핸들러 .logoutSuccessHandler(logoutSuccessHandler()) // 로그아웃 성공 후 핸들러 LogoutFilter POST방식으로 처리한다 AutPathRequestMatcher(/logout) 로 logout 링크와 일치하지 않으면 ..
정의 UsernamePasswordAuthenticationFilter는 login Form인증하는 필터이다. AbstractAuthenticationProcessingFilter는 UsernamePasswordAuthenticationFilter의 부모 클래스이다. AuthenticationManager는 인증객체를 받아서 AuthenticationProvider에 인증처리 위임 인증된 Authentication을 SecurityContext 객체에 저장한다. SecurityContext는 인증객체를 저장하는 보관소이다.
WebSecurityConfigurerAdapter WebSecurityConfigurerAdapter 을 상속받고 configure를 오버라이드하여 사용한다. WebSecurityConfigurerAdapter - configure protected void configure(HttpSecurity http) throws Exception { this.logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity)."); http.authorizeRequests((requests) -> { ((AuthorizedUrl)requests...
| Security Filter Spring Security의 동작은 사실상 Filter로 동작한다고 해도 무방하다. 각 Filter 들은 각자 다른 기능을 하고 있다. 이런 Filter들은 유기적으로 제외, 추가 및 순서를 정할 수 있다. 필터의 종류는 많지만 가장 많이 쓰이는 필터는 아래와 같다 SecurityContextPersistenceFilter BasicAuthenticationFilter CsrfFilter RememberMeAuthenticationFilter AnonymousAuthenticationFilter FilterSecurityInterceptor ExceptionTranslationFilter 1. SecurityContextPersistenceFilter 역할 Securit..
| ThreadLocal 대부분의 경우 요청 1개에 Thread 1개가 생성된다. 이때 ThreadLocal을 사용하면 Thread마다 고유한 공간을 만들 수 있고 그곳에 SecurityContext를 저장할 수 있다. 공유전략으로 3가지 방법이 있으며 기본적으로 ThreadLocal을 사용한다 MODE_THREADLOCAL, MODE_INHERITABLETHREADLOCAL, MODE_GLOBAL 대부분 ThreadLocal을 사용한다 Spring Security의 기본적인 Security Context 관리 전략은 ThreadLocal을 사용하는 ThreadLocalSecurityContextHolderStrategy이다. 변수는 지연변수, 전역변수 등 유효한 Scope을 가진다. 마찬가지로 Thre..
| Spring Security 내부구조 SecurityContextHolder -> SecurityContext -> Authentication -> Principal & GrantAuthority SecurityContextHolder SecurityContext를 제공하는 static 메소드(getContext)를 지원한다SecurityContext 접근 주체와 인증에 대한 정보를 담고 있는 Context이다. 즉, Authentication을 담고있다 Authentication Principal, GrantAuthority를 제공한다 인증이 이루어지면 해당 Authentication이 저장된다 Principal 유저에 대한 정보 대부분 Principal로 UserDetails를 반환한다 Grant..
| Spring Security 란? 스프링 생태계에서 인증과 인가를 최대한쉽고 유연하게 구현할 수 있도록 만들어진 framework 이다. Web 기반 Application에 보안적인 제한을 추가하기 위해 사용하는 Security Framework 중에 하나이다. Spring Security의 주요 목표는 Rest API endpoint, mvc url, 정적리소스와 같은 리소스들에 접근하려는 요청의 인증을 책임지는 것이다. Spring Security는 생태계와 호환성이 높고 커스텀이 매우 쉽다 https://docs.spring.io/spring-security/reference/index.html Spring Security :: Spring Security If you are ready to s..
| Spring Cloud Config의 이해 Cloud-native 애플리케이션의 중요한 이슈 중 하나는 분산된 서비스에 대한 설정과 관리이다. 개발자는 배포된 서비스와 서비스 환경 개수 만큼 설정을 변경하는데 많은 시간을 소비해야 한다 서비스가 수평적으로 확장되는 Auto Scaling이 될 때마다 서비스의 설정을 직접 변경해 줘야 한다. Spring Cloud Config는 분산되어 있는 여러 서비스의 설정을 관리할 수 있는 서버와 클라이언트를 제공한다 Spirng Cloud Config는 파일 및 git형태로 가지고 있을 수 있다. 마이크로서비스가 실작할 때 Spring Cloud Config에서 관리하는 설정 정보를 요청한다 마이크로서비스는 다양한 환경에서 실행될 수 있으므로 Spring Clo..
| MSA의 단점 및 해결책 단점 해결책 SpringCloud 다수의 필요한 서비스는 어떻게 찾는가? 서비스 디스커버리 Eureka 사용하기 위한 다수 서비스의 인스턴스를 어덯게 결정해야 하는가? 클라이언트-사이드 로드 밸런싱 Ribbon 개별적인 서비스가 응답하지 않을 때 어떤 일이 발생하는가? 결함허용 Circult-Breaken/Hystrix 보안, 속도제한과 같은 서비스 접근을 어떻게 제어하는가? 서비스 보안 OAuth2 다수의 서비스는 서로 어떻게 커뮤니케이션 하는가? HTTP/메시징 Feign/Spring Cloud Stream 서비스간 ACID는 어떻게 달성하는가? CQRS Condujctor/Camel/.... | Spring Cloud 소개 Netflix OSS(Open Source So..
목표 : http 응답 관련 공부 ( ResponseEntity, ResponseStatus 등) package hello.springmvc.basic.response; import hello.springmvc.basic.HelloData; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.w..
JSON으로 HTTP 요청 메시지에 대한 컨트롤러에서의 처리 방법 import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.stereotype.Controller; import org.springframework.util.StreamUtils; import java.nio.charset.StandardCharsets; /** * {"username":"hello", "age":20} * content-type: application/json */ @Slf4j @Controller public class RequestBodyJsonController { private ObjectMapper objectMapper = new..