위와 같이 failureUrl 지정하지 않았을 경우에는 이렇게 애플리케이션 홈 화면이 잘 나타납니다. 그런데 이렇게 failureUrl 을 별도로 지정해주게 되면 홈 화면에서도 인증을 요구하고 인가 처리에 대한 설정이 무시되어 버립니다. 왜 이렇게 되는 것인가요? 강의에서 이 현상에 대해서는 별 말씀 없으셔서 혼란스럽네요.
customFilter 메소드에 http를 전달받는 부분은 무시하라고 하셨는데 강의 자료에도 http를 인수로 넘기는 부분이 그대로 있어서, 이건 수정이 필요한 부분인가요? 다른 질문이 또 있습니다. HttpSecurity 사용과 직접 생성의 차이점이 궁금합니다. 직접 생성 방식 우리가 생성한 필터?(CustomAuthenticationFilter이게 맞는지는 모르겠지만)를 통해 인증을 진행할 때 ,직접 생성한 AuthenticationManger를 사용해서 인증을 진행하도록 한다고 이해했습니다. 이게 맞나요? http.formLogin을 통해 FormLoginConfigurer를 설정하는 부분이 있던데, UsernamePasswordAuthenticationFilter가 DaoAuthenticationProvider를 사용하지만, 우리가 만든 CustomAuthenticationFilter가 사용하는 AuthenticationManager에도 DaoAuthenticationProvider를 사용하니까 여기서 처리되도록 한 것인가요? 굳이 formLogin 부분이 추가된 이유를 명확하게 잘 모르겠습니다. HttpSecurity 사용 방식 여기서는 AuthenticationManager를 AuthenticationManagerBuilder를 통해서 생성하는데, 이 authenticationManager는 그럼 기본적으로 AuthenticationProvider들을 갖고있는게 있나요? 생성 후 따로 넣어주는 authenticationProvider들이 없는 것 같아서 이해가 잘 안됩니다.
프로젝트에서 WEB-INF/ 하위에 jsp 파일들을 저장할 때 SecurityConfig 에서 http .authorizeHttpRequests((requests) -> requests .requestMatchers("/css/**", "/js/**", "/images/**", "/WEB-INF/**", "/fonts/**").permitAll()) 이렇게 WEB-INF 하위 디렉토리도 permitAll로 설정해 줘야 하는지요? 아니면 다른 방법을 사용하나요?
HttpSecurityConfiguration 클래스에 브레이크 포인트를 찍고, 디버그 모드로 실행했습니다. HttpSecurityConfiguration 설정 클래스에 HttpSecurity bean을 생성하는 메소드가 여러 번 호출되는 것 같은데 맞나요? 여러 번 호출되는게 맞다면 그 이유가 뭔지 모르겠어서 답변해주시면 감사하겠습니다. 그 외에도 http.build() 를 하는 부분에서 계속 this 참조가 가리키는 객체가 변경되면서 실행되던데 잘 이해가 안됩니다.
<input type="hidden" th:value="secret" name="secret_key" /> 에서 hidden으로 안보이게 숨겨는 놨지만 f12를 눌러 소스코드를 보면 결국 이 value값이 보이는데 보안상에는 문제가 없는건가요? 만약 문제가된다면 어떻게 해결하면 되나요?
안녕하세요 강의 잘 수강하고 있습니다. 질문이 있어 글 남기게 되었습니다. SecurityContext 는 기본적으로 SecurityContextHolder 에 의해 관리되며, 기본적으로 ThreadLocal 변수에 저장된다고 알고 있습니다. TreadLocal 은 스레드별로 독립적으로 생성되는 변수라고 알고 있는데, 그러면 invalidateHttpSession 메서드는 서버의 세션을 무효화하는 기능이고, clearAuthentication 메서드는 현재 스레드의 SecurityContext 에서 Authenitcation 을 삭제하는거라고 이해하면 될까요?
항상 퀄리티 높은 강의 감사합니다! 몇가지 궁금한게 있어서 질문드립니다. @Service어노테이션으로 인해 이미 빈으로 등록되어서 .userDetailsService(userDetailsService) 을 쓰지 않아도 자동으로 등록이 되는걸로 알고있었는데 코드를 쓰는 이유가 있나요? 왜 @Service 이름을 " userDetailsService" 로 하신건지 궁금합니다. SecurityConfig 에서 private final UserDetailsService userDetailsService; 에서 FormUserDetailsService 대신 UserDetailsService 을 쓰는 이유가 뭔지 궁금합니다. (그냥 클래스를 그대로 쓰면 안되는건가요?)
안녕하세요, 좋은 강의 제공해주셔서 감사합니다. FilterChainProxy 타입의 빈을 등록했는데 왜 CompositeFilterChainProxy 타입의 빈이 나오는 궁금합니다. 2. FilterChainProxy 도 여러 개가 존재할 수 있는 걸로 알고, SecurityFilterChain 도 여러 개 존재할 수 있는 것을 배웠습니다. 요청에 따라 FilterChainProxy 와 SecurityFilterChain 을 선택하는 부분에 대한 설명이 없는 것 같은데 맞나요? 이것까지 이해하는건 어렵긴 합니다..
rememberMe 의 흐름상 자동 로그인을 하는 것으로 보이는데 강의 들으면서 나름 커스텀하여 로그인 창이 뜰때 아이디만 저장하기 기능을 추가하고 싶은데 어떻게 해야할까요? 1. 로그인창 a. 처음에는 세션, 쿠키도 없으니 빈칸 로그인 성공이후 로그인 정보의 아이디값을 쿠키 에 넣는다. 로그아웃이후 쿠키가 남아있으면 아이디 란에 아이디를 넣는다. 를 하고 싶어용
동시 세션 제어에서, invalidSessionUrl 경로를 지정하고 expiredUrl 경로를 지정하지 않았을 때 'This session has been expired' 메시지가 나오는데, 한 번 더 새로고침을 하면 정상적으로 invalidSessionUrl 경로로 가네요. ?continue 경로로 302 응답 후 invalidSessionUrl 200 응답으로 되네요. 제 생각에는 버그가 아닐까 싶긴 합니다.
안녕하세요 강사님, 실정강의 중에 궁금한 사항이 있어 질문드립니다. FromLogin방식에서는 CustomFilter를 따로 생성하지 않고 Ajax 비동기 로그인 방식에서만 CustumFilter를 생성하여 http.addFilter 로 필터를 추가하신 내용을 수강중입니다. 궁금산사항은 FormLogin 방식에서는 왜 필터를 추가를 안하고 비동기 통신 로그인 일때만 필터를 추가하는지 그 이유가 궁금하여 질문드립니다.
안녕하세요 현재 강의 초반부 수강중인 수강생입니다. 혹시 실전프로젝트 자료에 포함된 내용중에 JWT를 사용하여 인증을 하는 예제도 제공이될까요? 아니면 JWT에 대한 예제는 없는걸까요? github에서 제가 못찾는건지 궁금하여 질문드립니다. 사내 업무에서 전통적인 세션기반인증이 아닌 JWT를 사용한 인증을 사용하려다보니 해당내용이 강의자료에는 없는것 같아 질문드립니다. 강의를 전부 수강하지 못하고 질문드리는 점 양해부탁드립니다.
안녕하세요. 강사님 강의 듣고 WebFlux 방식에서도 프로그래밍 방식 또는 동적방식으로 권한을 적용해 보고자 이것저것 해보고 있는데요. WebFlux 방식에서는 DelegatingReactiveAuthorizationManager 클래스에서 private final List<ServerWebExchangeMatcherEntry<ReactiveAuthorizationManager<AuthorizationContext>>> mappings; 이 형식으로 mappings를 생성자로 넘겨주거나 생성될때 build add() 메서드로 한건식 넘겨주면 List 형식에 추가되어 요청이 들어오면 아래의 check메서드에서 해당 요청을 체크하는 것 같습니다. @Override public Mono<AuthorizationDecision> check(Mono<Authentication> authentication, ServerWebExchange exchange) { return Flux.fromIterable(this.mappings) .concatMap((mapping) -> mapping.getMatcher() .matches(exchange) .filter(MatchResult::isMatch) .map(MatchResult::getVariables) .flatMap((variables) -> { logger.debug(LogMessage.of(() -> "Checking authorization on '" + exchange.getRequest().getPath().pathWithinApplication() + "' using " + mapping.getEntry())); return mapping.getEntry().check(authentication, new AuthorizationContext(exchange, variables)); })) .next() .defaultIfEmpty(new AuthorizationDecision(false)); } 문제는 mappings 정보를 어떻게 만들어서 넘겨야 할지 감이 안옵니다. .pathMatchers(HttpMethod.GET, "/routes").permitAll() .pathMatchers(HttpMethod.POST, "/auth-server/**").permitAll() .pathMatchers(HttpMethod.POST,"/auth-service/auth/token").permitAll() .pathMatchers(HttpMethod.GET,"/auth-service/api/v1/users").hasRole("ROLE_USER") 이 4개의 pathMatchers를 아래의 형식으로 해서 List로 넘겨야 할듯 한데 어떻게 할 수 있을까요? ServerWebExchangeMatcherEntry<ReactiveAuthorizationManager<AuthorizationContext>>> new ServerWebExchangeMatcherEntry<ReactiveAuthorizationManager<AuthorizationContext>>( ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/auth-service/api/v1/users"), AuthorityReactiveAuthorizationManager.hasRole("ROLE_USER")) 위의 방법으로 객체를 하나하나 만들어서 넘겨보기도 했는데 Role이 지정된 건 적용이 됩니다. 그러나 permitAll()을 시켜줘야 하는 것들은 어떻게 적용시켜야 할지... 하루종일 방법을 찾아봤는데 내공 부족으로 인하여 못찾고 해매고 있습니다. 도움 부탁드립니다.