묻고 답해요
135만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
회원 권한이 있어도 deinied로 가는데 이유가 뭘까요? ㅠㅠ
package io.security.springsecuritymaster.security.config; import io.security.springsecuritymaster.security.filter.RestAuthenticationFilter; import io.security.springsecuritymaster.security.handler.FormAuthenticationSuccessHandler; import io.security.springsecuritymaster.security.handler.FromAuthenticationFailureHandler; import io.security.springsecuritymaster.security.handler.FromAccessDeniedHandler; import io.security.springsecuritymaster.security.handler.RestAuthenticationFailureHandler; import io.security.springsecuritymaster.security.handler.RestAuthenticationSuccessHandler; import io.security.springsecuritymaster.security.provider.RestAuthenticationProvider; import io.security.springsecuritymaster.security.token.RestAuthenticationToken; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.security.authentication.AuthenticationDetailsSource; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.WebAuthenticationDetails; @EnableWebSecurity @Configuration @RequiredArgsConstructor public class SecurityConfig { // private final UserDetailsService userDetailsService; private final AuthenticationProvider authenticationProvider; private final RestAuthenticationProvider restAuthenticationProvider; private final FormAuthenticationSuccessHandler formAuthenticationSuccessHandler; private final FromAuthenticationFailureHandler fromAuthenticationFailureHandler; private final RestAuthenticationSuccessHandler restAuthenticationSuccessHandler; private final RestAuthenticationFailureHandler restAuthenticationFailureHandler; private final AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> authenticationDetailsSource; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .requestMatchers("/css/**", "/images/**", "/js/**", "/favicon.*", "/*/icon-*").permitAll() // 정적 자원 설정 .requestMatchers("/", "/signup", "/login*").permitAll() .requestMatchers("/user").hasAuthority("ROLE_USER") .requestMatchers("/manager").hasAuthority("ROLE_MANAGER") .requestMatchers("/admin").hasAuthority("ROLE_ADMIN") .anyRequest().authenticated() ) .formLogin(form -> form .loginPage("/login").permitAll() .authenticationDetailsSource(authenticationDetailsSource) .successHandler(formAuthenticationSuccessHandler) .failureHandler(fromAuthenticationFailureHandler) ) // .userDetailsService(userDetailsService) .authenticationProvider(authenticationProvider) .exceptionHandling(exception -> exception.accessDeniedHandler(new FromAccessDeniedHandler("/denied"))) ; return http.build(); } @Bean @Order(1) public SecurityFilterChain restSecurityFilterChain(HttpSecurity http) throws Exception { AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); authenticationManagerBuilder.authenticationProvider(restAuthenticationProvider); AuthenticationManager authenticationManager = authenticationManagerBuilder .build(); http .securityMatcher("/api/login") .authorizeHttpRequests(auth -> auth .requestMatchers("/css/**", "/images/**", "/js/**", "/favicon.*", "/*/icon-*").permitAll() // 정적 자원 설정 .anyRequest().permitAll() ) .csrf(AbstractHttpConfigurer::disable) .addFilterBefore(restAuthenticationFilter(http, authenticationManager), UsernamePasswordAuthenticationFilter.class) .authenticationManager(authenticationManager) ; return http.build(); } private RestAuthenticationFilter restAuthenticationFilter(HttpSecurity http, AuthenticationManager authenticationManager) { RestAuthenticationFilter restAuthenticationFilter = new RestAuthenticationFilter(http); restAuthenticationFilter.setAuthenticationManager(authenticationManager); restAuthenticationFilter.setAuthenticationSuccessHandler(restAuthenticationSuccessHandler); restAuthenticationFilter.setAuthenticationFailureHandler(restAuthenticationFailureHandler); return restAuthenticationFilter; } // @Bean // public UserDetailsService userDetailsService() { // UserDetails user = User.withUsername("user").password("{noop}1111").roles("USER").build(); // return new InMemoryUserDetailsManager(user); // } }
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
AuthenticatedAuthorizationManager 흐름도 질문
RequestMatcher가 Request와 매칭되는지 확인결과가 Y라면, entry를 호출해 authorizationManager를 통해 인가 체크.결과가 N이라면, 다음 RequestMatcherEntry의 RequestMatcher를 살펴보는 거 아닌가요?흐름도에는 N인데 바로 AccessDeniedException이 터진다고 되어있는데..
-
해결됨CPPG 개인정보관리사 자격증 취득하기 (개정안 반영)
강의 일시정지 부탁드려요.
개인적인 사정으로 공부를 좀 미뤄야 할 것 같아요. 강의 일시정지 부탁드려요.
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
섹션2 인증프로세스 마지막 강의 SavedRequest 질문있습니다
강의 잘 듣고있습니다. 궁금한 점은 다음과 같습니다.로그인 성공 시, onAuthenticationSuccess 내부에서파라미터 continue를 사용하지 않고 , 다음과 같이 /home 으로 이동하도록 하였습니다.response.sendRedirect("/home")그리고 /home 요청을 처리할 때,RequestCacheAwareFilter 에서 SavedRequest 를 사용하지 않고 현재 request를 다음 필터로 넘기는 것을 보았고, 어차피 로그인이 성공되었으니, 정상적으로 /home 으로 가는 것도 확인하였습니다.SavedRequest 를 사용하면 성능상 이점이 있다고 하셨지만, 어떤 부분에서 이점이 있는지 모르겠습니다.SavedRequest 나 현재 request 는 같을텐데, 어떻게 이점이 있는지 궁금합니다 .감사합니다.
-
해결됨CPPG 개인정보관리사 자격증 취득하기 (개정안 반영)
CVM기법
기명식 기프트카드는 개인정보의 추적성을 제공하여 개인정보의 가치를 투영할 수 있는 대상으로 인식된다.이 부분이 정확히 무슨 내용인지 감이 안 잡히는데요~~ 설문 했다고 받은 기프트카드가 왜 개인정보 가치 투영 대상이 되는지 잘 모르겠습니다ㅠ
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
공격자의 세션을 피해자가 사용하는 부분이 이해가 안 됩니다
같은 질문아 밑에 있긴한데 답변이 이해가 안가서 다시 질문을 올립니다.공격자가 서버로부터 세션 쿠키를 얻었다는 건 공격자가 로그인을 했다는 거 아닌가요?이 세션 쿠키를 다른 피해자에게 강제로 사용하도록 하는 걸 세션 고정 공격이라고 하는 것 맞나요?이게 맞다면 피해자의 활동을 서버에서는 공격자의 활동으로 인식하게 되는거고, 피해자는이미 공격자의 세션쿠키를 갖고 있으니까 별다른 인증이 필요 없은 것 아닌가요?피해다가 또 로그인을 한다는 부분이 잘 이해가 안 됩니다.아니면, 피해자가 공격자의 세션 쿠키를 들고있음에도 로그인 페이지로 접속하여 로그인을 하게됐을 때, 서버에서 새로운 세션을 생성해서 세션쿠키를 내려주지 않는다면, 공격자도 같은 세션쿠키를 사용해서 사용자 정보 페이지등에 접근이 가능하게 되는 위험을 말한다고 생각하면 될까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
RequestMatcherDelegatingAuthorizationManager 로 인가 설정 응용하기에서 질문이 있습니
안녕하세요. 선생님 SpringConfig에서 어떤 요청이든 인정 허용하려고 ".anyRequest().authenticated())"로 설정하셨는데 해당 강의에서는 ".anyRequest().access(authorizationManager(null)))"으로 해주셨는데 혹시 이유가 있을까요?CustomRequestMatcherDelegatingAuthorizationManager에서 introspector에 대한 return 값이 맞는 게 없어서 강제적으로 null로 처리하신건가요?아니면 모든 요청을 인정 허용하니 introspector을 null로 해서 authorizationManager에 대한 모든 값 (null 포함)해서 허용한다는 의미인가요?바쁘시겠지만 확인 부탁드립니다~
-
미해결CPPG 자격증 취득 과정 (2024년)
교재문의
교재는 어디서 다운 받을수 있을까요?'PDF 강의 교안은 유료 비공개 강의 첫 영상에 업로드합니다.'라고 되어 있어서 첫 강의의 수업노트 보기에서도 찾을수가 없습니다.
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
csrf Post 요청 시 에러
안녕하세요.csrf.http 파일로 /csrf post 방식에 헤더에 값을 넣어서 테스트 중인데요.강사님이 말씀해주신 방법으로 해도 테스트가 진행이 안되서 질문드립니다.login 페이지에 생성된 토큰 값을 요청 시에 같이 전달했는데 왜작동이 되지 않을까요??### GET request with a header GET http://localhost:8080 Content-Type: application/json ### POST request with a header POST http://localhost:8080/csrf Content-Type: application/json ### POST request with a header POST http://localhost:8080/csrf Content-Type: application/x-www-form-urlencoded _csrf = GQUnQECQsPrRDBd53iPaRAYfoKozqh0dZfg91MeDiOKw3OOtKjUQcHb00578aiNN6A7ufTEpjZMAyXswV85b4KSyutqB7IeY ### Send GET request with json body GET http://localhost:8080/csrfToken Content-Type: application/json위는 csrf.http 파일입니다.강사님은 요청이 성공적으로 되는데 저는 똑같이 로그인 페이지가 계속 나오더라구요..
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
SecurityContextRepository / SecurityContextHolderFilter - 2 강의 질문 있습니다
13분 40초에 세션에서 Context 객체가 있는지 확인하고세션에 없어서 request 를 확인한다고 하셨는데, request 확인하는 부분을 건너뛰고 바로 AnonymousAuthenticationToken 을 만드는 부분으로 넘어가셨네요인증이 없는 상태에서 요청하면 SecurityContext를 찾을 때, reuqest는 확인하지 않고 세션만 확인하는걸까요 ?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
안녕하세요!
안녕하세요!선생님께서 올려주신 강의를 수강하고 있는 수강생입니다!다름이 아니라 강의의 정리 또는 요약을 한 내용을 블로그 또는 깃허브에 올려도 괜찮을까요??출처는 모두 표시하겠습니다!이상입니다!감사합니다!
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
securityMatcher, requestMatcher의 차이점이 뭔가요?
정확히 이해가 안가요http.securityMatcher("/api/**")http.requestMatcher("/api/**")둘다 /api 하위에 보안 필터를 적용하기 위함이 아닌가요?어떤 차이가 있는지 명확히 알고싶어요
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
폼 로그인 방식 failureUrl 지정 시 인가 처리 API 가 작동하지 않습니다.
위와 같이 failureUrl 지정하지 않았을 경우에는 이렇게 애플리케이션 홈 화면이 잘 나타납니다. 그런데 이렇게 failureUrl 을 별도로 지정해주게 되면 홈 화면에서도 인증을 요구하고 인가 처리에 대한 설정이 무시되어 버립니다. 왜 이렇게 되는 것인가요? 강의에서 이 현상에 대해서는 별 말씀 없으셔서 혼란스럽네요.
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
@Role 어노테이션은 무슨 역할인가요?
@Bean 등록할 때 사용이 되던데왜 쓰는건지 궁금한데 제가 강의 보다가 놓친건지 ㅠㅠ 궁금합니다
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
userdetail java 17 버전 못쓰는것같습니다.
@Bean public UserDetailsService userDetailService(){ UserDetails userDetails = User.withUsername ( "user" ) .password ( "{noop}1111" ) .roles ( "USER" ) .build ( ); return new InMemoryUserDetailsManager ( userDetails ); } // 어떻게 바꿔주면 해결이 될까요..
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
발음이 이해가 안되는 게 있어요
16:28 시간대에 서브르 하겠다? 라고 하시는데 이게 뭔지 잘 모르겠어요…
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
AuthenticationManger - HttpSecurity 사용
customFilter 메소드에 http를 전달받는 부분은 무시하라고 하셨는데강의 자료에도 http를 인수로 넘기는 부분이 그대로 있어서, 이건 수정이 필요한 부분인가요?다른 질문이 또 있습니다.HttpSecurity 사용과 직접 생성의 차이점이 궁금합니다.직접 생성 방식우리가 생성한 필터?(CustomAuthenticationFilter이게 맞는지는 모르겠지만)를 통해 인증을 진행할 때 ,직접 생성한 AuthenticationManger를 사용해서 인증을 진행하도록 한다고 이해했습니다. 이게 맞나요?http.formLogin을 통해 FormLoginConfigurer를 설정하는 부분이 있던데,UsernamePasswordAuthenticationFilter가 DaoAuthenticationProvider를 사용하지만,우리가 만든 CustomAuthenticationFilter가 사용하는 AuthenticationManager에도 DaoAuthenticationProvider를 사용하니까 여기서 처리되도록 한 것인가요? 굳이 formLogin 부분이 추가된 이유를 명확하게 잘 모르겠습니다.HttpSecurity 사용 방식여기서는 AuthenticationManager를 AuthenticationManagerBuilder를 통해서 생성하는데,이 authenticationManager는 그럼 기본적으로 AuthenticationProvider들을 갖고있는게 있나요? 생성 후 따로 넣어주는 authenticationProvider들이 없는 것 같아서 이해가 잘 안됩니다.
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
csrf 통합에서 html 소스코드 있을까요?
안녕하세요.현재 csrf 통합까지 듣고있는 학생입니다올려주신 pdf 파일을 봤을 때 소스코드가 없어서 문의드립니다.코드를 보면서 강의를 들으면 더 잘 이해가 될 것 같은데 어디서 얻을 수 있나요?ㅜㅜ
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
JSP를 사용하는 경우 정적 자원 보호를 어떻게 설정해야 하나요?
프로젝트에서 WEB-INF/ 하위에 jsp 파일들을 저장할 때 SecurityConfig 에서 http .authorizeHttpRequests((requests) -> requests .requestMatchers("/css/**", "/js/**", "/images/**", "/WEB-INF/**", "/fonts/**").permitAll()) 이렇게 WEB-INF 하위 디렉토리도 permitAll로 설정해 줘야 하는지요? 아니면 다른 방법을 사용하나요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
HttpSecurity bean을 생성하는 메소드
HttpSecurityConfiguration 클래스에 브레이크 포인트를 찍고, 디버그 모드로 실행했습니다.HttpSecurityConfiguration 설정 클래스에 HttpSecurity bean을 생성하는 메소드가 여러 번 호출되는 것 같은데 맞나요?여러 번 호출되는게 맞다면 그 이유가 뭔지 모르겠어서 답변해주시면 감사하겠습니다.그 외에도 http.build()를 하는 부분에서 계속 this 참조가 가리키는 객체가 변경되면서 실행되던데 잘 이해가 안됩니다.