수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 시큐리티
특정 유저에게만 특정 요청을 인가하려면 어떻게 하는게 좋을까요?
글작성 유저 본인만 글을 수정 / 삭제하는걸 고민하고있는데 1차적으론 클라이언트 뷰에서 막아야겠지만 서버에서도 막으려면 1. 해당 요청을 다루는 컨트롤러에서principal을 받아와 해당 요청에 본인이 맞는지 확인하는 로직을 집어넣기 2. 인터셉터나 필터로 위의 로직을 구현 두가지정도 방법은 떠올렸습니다. 하지만 시큐리티에서 분명 이런 api를 다루고있을거같은데 아직 공부가 부족해서 명확하게 정답이 떠오르질않네요 ㅠ metadatasource클래스를 작성해서 사용하면 될까요?
- 미해결스프링 시큐리티
remote address 질문드립니다.
안녕하세요! 강의에서 voter 객체에서 remote address 를 얻기위해 인증객체의 details 객체를 얻어오는데요! 제가 알기로는 FilterInvocation 에서 request 객체를 얻어올 수 있고 request 에도 remote addr 정보가 있는것으로 알고있는데 이 정보로 써도 상관 없나요? 감사합니다.
- 미해결스프링 시큐리티
강의 도중 나오는 이미지에 대한 저작권 허용 범위가 궁금합니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강의를 보며 정리를 하고 있는 학생입니다 강의를 정리하던 도중 문득 강의 내 이미지 저작권에 대해 고민이 되어 질문을 남깁니다 1. 블로그에 비공개로 작성하는 것 까지만을 허용한다 2. 블로그에 공개해도 되나, 출처를 명확히 작성해야 한다 3. 자유이다 블로그에 게시하는 것이 목적이지만 어느정도 까지 가능한지 알고싶습니다. 감사합니다.
- 미해결스프링 시큐리티
선생님 연관관계 궁금한 부분이 있습니다..
시큐리티에서 좀 벗어난 질문인데 강의를 보다가 궁금한 부분이 생겼습니다.. 엔티티의 연관관계 설정할 떄 (회원과 권한 기준으로) 회원(User), 권한(Role)가 서로 ManyToMany로 설정여 연관관계의 주인엔티티(User)에서 @JoinTable로 User_Role 매핑테이블을 찾아가는 것과 회원(User), 권한(Role) + 회원권한(User_Role) 엔테티 자체를 추가로 만들어서 OneToMany 구현해주는것의 차이. 1. 둘다 N:M관계를 처리하기 위해 설정 할 수 있는 매핑이 맞는지요? 2. 이 둘의 차이는 중간에 매핑테이블이 생성되는건 똑같이 생성되는데 User_Role을 엔티티로 만들어 두냐 아니냐로 나뉘어지는 건가요? JPA랑 병행 학습하면서 시큐리티 강의를 듣고 있어서 한참 질문 수준이 부족한 것 같습니다..
- 미해결스프링 시큐리티
AffirmativeBased 객체에 대한 질문입니다.
안녕하세요. 강의 코드를 직접 타이핑하여 테스트하는중인데 동작이 달라서 질문드립니다. 데이터베이스를 통해 자원 권한처리를 하지 않고 설정클래스로 자원 권한처리를 하였을 때 AcecessDeniedException이 발생하면 화면에 "Access is denied" 메세지가 잘 출력이 되는데요. 강의와 같이 MetadataSource, SecurityInterceptor 등 여러 커스텀 객체를 추가하여 데이터베이스에서 자원의 권한정보를 읽어와서 인가처리시 AcecessDeniedException이 발생하면 화면에 물음표의 형태로 출력되어 제대로 메시지가 출력이 안됩니다. 보니까 인코딩 문제로 물음표로 표시되는데, 그 새로 추가한 AffirmativeBased에서 예외 발생시 예외 메시지가 한글로 출력이 되어서 인코딩문제로 페이지에 제대로 표시가 안되는 현상인것 같습니다. 그런데 제가 궁금한것은 설정 클래스를 통해 인가처리시에는 예외메시지가 영어로 출력되는데, AffirmativeBased 객체를 생성해서 커스텀 FilterSecurityInterceptor를 사용할 때는 예외메시지가 한글로 나오는데 왜 동작이 다른지 궁금합니다. 디버깅모드에서 보니까 AffirmativeBased의 속성중 MessageSource가 설정클래스로 했을때와 다른 것 같은데 직접 생성할때와 설정클래스를 이용할 때 메시지소스 설정이 다르게 되는건가요? 강의 동영상에서는 잘 되는것같은데 저는 왜 안되는지 궁금합니다. 감사합니다.
- 해결됨스프링 시큐리티
런타임 중, 메소드 인가 맵 등록시, 서비스 Proxy 가 만들어지지 않는 이유의 질문입니다.
좋은강의 감사드립니다. 약간 다른 시도를 해보고 잘 안풀리게되어 질문을 남기게 되었어요.메소드 권한 부여는 반드시 MapBasedMethodSecurityMetadataSource 생성자를 통해서만 등록이 가능할까요? 초기화가 끝난 이후 런타임에서 addSecureMethod(string, configAttrList) 를 통해 등록하면 프록시 생성이 안되는것 같더라구요.. 그래서 아래와 같은 시도가 있었습니다. 저는 MapBasedMethodSecurityMetadataSource 를 extends 하여 CustomMapBasedMethodSecurityMetadataSource 를 만들어, 생성이 된 이후, 메소드 리소스맵 등록을 super.addSecureMethod() 메서드로 하려는 시도를 했습니다. 이후 @EventListener(ContextRefreshedEvent.class) 이벤트 핸들러를 MethodSecurityConfig 에 작성하고, 이벤트 발생 시점에 App컨택스트로 부터 CustomMapBasedMethodSecurityMetadataSource 를 가져와 reload() 를 호출하여 Map 을 통해 메서드 정보 등록이 되도록 구성했습니다 문제는서버 기동 및 컨트롤러 호출 후, Method Resource 가 등록 과정에 서비스 프록시 가 생성되지 않아 서비스 메서드 가 그대로 호출이 되었는데요, Debug 확인 결과 클래스 명 메소드명 Map 파싱은 문제가 없었습니다. 아래는 서버 기동 후, 커스텀 메소드 메타데이터 소스 를 메모리에서 조회 결과입니다. 위의 과정으로반드시 생성자를 통해 Map 을 전달 해야만 Proxy 생성이 되는것으로 판단되었습니다이벤트 리스너를 통해 methodMap 등록을 지연하게 되면 필터링 처리가 안되는 이유가 궁금한데요..이런 부분에 대해 조언을 구합니다. 아래는 작성한 Method..Config 와 Method...Source 입니다 MethodSecurityConfig public class MethodSecurityConfig { ... /** * DB 초기화 직후, METHOD 인가정보 등록 */ @EventListener(ContextRefreshedEvent.class) @Transactional public void onContextRefreshed(ContextRefreshedEvent event) { ApplicationContext ctx = event.getApplicationContext(); var customMapBasedMethodSecurityMetadataSource = ctx.getBean(CustomMapBasedMethodSecurityMetadataSource.class); customMapBasedMethodSecurityMetadataSource.reload(); } ...} CustomMapBasedMethodSecurityMetadataSource public class CustomMapBasedMethodSecurityMetadataSource extends MapBasedMethodSecurityMetadataSource { private final MethodResourceMapFactoryBean methodResourceMapFactoryBean; public CustomMapBasedMethodSecurityMetadataSource(MethodResourceMapFactoryBean methodResourceMapFactoryBean) { /* 생성자를 통해 methodMap 전달시 작동 */// super(Map.of(// "io.security.corespringsecurity.aopsecurity_test.AopMethodAuthTestService.methodSecured",// List.of(new SecurityConfig("ROLE_USER"))// )); this.methodResourceMapFactoryBean = methodResourceMapFactoryBean; } /** * DB 데이터 초기와 직전 로딩 이슈로, DB 초기화 이후 값을 가져오기위한 리로딩 메서드 */ public void reload() { LinkedHashMap<String, List<ConfigAttribute>> resourceMap = methodResourceMapFactoryBean.getObject(); for (Map.Entry<String, List<ConfigAttribute>> resourceEntry : resourceMap.entrySet()) { String fullPackageClassMethodName = resourceEntry.getKey(); List<ConfigAttribute> configAttributes = resourceEntry.getValue(); addSecureMethod(fullPackageClassMethodName, configAttributes); } } /** * 보안 메서드에 대한 설정을 추가합니다. 메서드 이름은 여러 메서드를 등록하기 위해 `*` 로 끝나거나 시작할 수 있습니다.<br /> * 풀패키지 클래스명 + 메서드명 파싱 및 S.Security 에 메서드 정보 추가 <br /> * Key: 풀패키지 클래스명 + 메서드명(ex: "a.b.Class.*method or method*") <br /> * Value: ConfigAttribute List <br /> * 참고: super 클래스 private addSecureMethod(name, attr) 메소드 복제 */ private void addSecureMethod(String name, List<ConfigAttribute> attr) { int lastDotIndex = name.lastIndexOf("."); Assert.isTrue(lastDotIndex != -1, () -> "'" + name + "' is not a valid method name: format is FQN.methodName"); String methodName = name.substring(lastDotIndex + 1); Assert.hasText(methodName, () -> "Method not found for '" + name + "'"); String typeName = name.substring(0, lastDotIndex); Class<?> type = ClassUtils.resolveClassName(typeName, ClassUtils.getDefaultClassLoader()); super.addSecureMethod(type, methodName, attr); } } 읽어주셔서 감사합니다.
- 미해결스프링 시큐리티
안녕하세요. 선생님
안녕하세요. 선생님 혹시 DB는 꼭 Postgre로 사용해야 하나요? 제가 Oracle, Mysql만 다루어 봤고. 무엇보다 현재 Mysql로 개인 프로젝트를 진행하고 있어서 질문드립니다. 공부와 실습 진행하면서 제 개인 프로젝트에도 직접 적용 해보고 싶어서 질문드립니다!
- 해결됨스프링 시큐리티
Authentication의 details 에 대해 질문 있습니다.
IpAddressFilter에서 authentication.getDetails() 부분에서 최초로 접근할 때는 details가 존재합니다. 이때는 authentication이 AnonymousAuthenticationToken 입니다. 그런데, 이미 인증이 된 후에는 강의에서 만든 AjaxAuthenticationToken이 쓰이는데, 여기서는 getDetails()를 하면 WebAuthenticationDetails가 null이 됩니다. AjaxAuthenticationToken에서도 details를 사용하려면 어떻게 해야할까요?...
- 미해결스프링 시큐리티
인증 실패 메세지 출력 질문입니다.
안녕하세요! 로그인 실패시 Failure 핸들러에서 리다이렉트할 때 요청 파라미터로 에러 여부와 에러메세지를 전달해서 컨트롤러에서 해당 파라미터 값을 모델에 담아서 뷰에 전달해서 뷰에서 에러메세지를 출력하는 것으로 이해 하였는데요! 스프링 MVC 공부할 떄 폼 데이터 검증 처리할 때 컨트롤러 단에서 bindingresult 를 이용해서 타임리프 뷰 템플릿 에러와 연동해서 에러메세지 출력하는 방법을 배웠었는데요! 실제로 실무에서 시큐리티 사용할 때 이런 에러메세지 처리는 강의처럼 파라미터로 전달해서 출력하는지요? 아니면 bindingresult를 이용할 수도 있나요?
- 미해결스프링 시큐리티
CustomAuthenticationProvider 질문입니다.
안녕하세요. 이번 강의에서 CustomAuthenticationProvider 를 생성해서 등록하여 사용자 인증을 진행하는 과정을 시뮬레이션 해보니까 CustomAuthenticationProvider 를 등록하기전에는 DaoAuthenticationProvider 를 통해서 사용자 인증과정이 진행이 되고, CustomAuthenticationProvider 를 등록하니까 DaoAuthenticationProvider는 더이상 등록되지 않고 CustomAuthenticationProvider을 통해서 사용자 인증과정이 진행이 되더라구요. 그래서 궁금한 것은 CustomAuthenticationProvider 를 사용하지 않고 이미 스프링 시큐리티에서 제공되는 DaoAuthenticationProvider 를 사용해도 될까요? 바로 이전 강좌에서 만든 CustomUserDetailsService는 사용자가 새로 만든 Account 라는 엔티티를 Repository 에서 불러와서 계정이 존재하는지 확인해야 하기 때문에 필수적으로 만들 수 밖에 없다고 이해하였는데요. 그 이후에 Password 검증이라던지 하는 과정은 어짜피 CustomUserDetailsService에서 반환하는 UserDetails 객체를 이용해서 진행하니까 굳이 CustomProvider를 만들필요 없이 DaoAuthenticationProvider를 사용하면 안될까요? 감사합니다.
- 미해결스프링 시큐리티
동시 세션 제어에 관하여 질문드립니다.
안녕하세요! 강의를 듣다가 헷갈려서 질문드립니다. 일단 스프링 부트 2.5.4 최신 버전으로 시큐리티 의존성 추가하여 테스트 하였습니다. 동시 세션 제어에서 두 가지 정책을 디버깅 모드에서 코드의 흐름을 테스트 하였는데요. 이전 사용자 세션 만료 혹은 현재 사용자 인증 실패 두 가지 모두 테스트 하였을때요. 일단 첫 번째 사용자가 인증을 받은 상태에서, 두 번째 사용자가 인증을 시도하는 시점에 필터의 실행 흐름을 제가 브레이크 포인트를 사용해서 확인하여 보았습니다. 이 때 SessionManagementFilter 에서 이전 사용자 세션 만료 또는 현재 사용자 인증실패가 동작하지 않구요. 인증 필터인 UsernamePasswordAuthenticationFilter 의 doFilter 메서드(코드는 부모 클래스인 AbstractAuthenticationProcessingFilter에 정의되어 있습니다.)안에서 sessionStrategy 참조 값(CompositeSessionAuthenticationStrategy 객체)의 onAuthentication 메서드를 통해서 처리합니다. 이 때 4가지 전략이 순차적으로 실행되는 것 같습니다. (ConcurrentSessionControlAuthenticationStrategy, ChangeSessionIdAuthenticationStrategy, RegisterSessionAuthenticationStrategy, CsrfAuthenticationStrategy) 강의에서는 SessionManagementFilter에서 이전 사용자 만료 또는 현재 사용자 인증실패를 처리하는 것으로 이해하였는데요. 실제 동작을 시뮬레이션 해보니 인증 필터인 UsernamePasswordAuthenticationFilter 에서 동작하는 것 같아서요. 제가 잘못 이해한걸까요? 아니면 버전이 달라서 코드가 변경된걸까요? 아니면 SessionManagementFilter 가 동작하는 조건이 다른걸까요? 조언 부탁드립니다. 감사합니다.
- 미해결스프링 시큐리티
초보같은 질문 하나만 하겠습니당..
SecurityContext contextAfterChainExecution = SecurityContextHolder.getContext();// Crucial removal of SecurityContextHolder contents before anything else.SecurityContextHolder.clearContext();this.repo.saveContext(contextAfterChainExecution, holder.getRequest(), holder.getResponse()); SecurityContextPersistenceFilter의 코드를 보면 위와 같이 되어있습니다. 중간에 clearContext()를 하면 contextAfterChainExecution 도 null이 된다고 생각했는데, 실제로는 null이 안되더라구요... 왜 그런건지 궁금합니다...
- 해결됨스프링 시큐리티
인증, 인가에 대해서
강의 잘 듣고 있습니다. 인증, 인가에 대해 살짝 애매한 부분이 있어 질문 드립니다. 지금까지 제가 이해한 바로는 "인증"이라는 것은 결과가 boolean 인 것 같습니다. 인증에 성공했거나 실패했거나 둘 중 하나로 결정할 수 있습니다. "인가"는 권한과 유사한 의미(?)이며, 커스터마이징이 가능하다. 예를 들어 USER, SYS, ADMIN 과 같이 얼마든지 추가하고 수정할 수 있다. 익명 인증에 대해서도 언급하셨는데, 익명 인증이라는 것이 존재하니, 인증에 실패했다는 경우는 존재하지 않는 것 아닐까요? 인증을 시도했다가 실패할 수는 있으나 어쨌든 결론적으로 익명 인증이라는 것을 default로 가지고 있으니까요. 음, 질문이 모호한 것 같은데 간단하게나마 알려주시면 감사하겠습니다. 쉽지 않네요,....
- 해결됨스프링 시큐리티
UsernamePasswordAuthenticationToken
안녕하세요 강사님, 뜬금없는 질문이 될 수 있지만 그래도 궁금한 것은 여쭤보고 싶어 질문 합니다. CustomAuthenticationProvider가 사용하고자 하는 토큰 이름이 UsernamePasswordAuthenticationToken이라는 것은 외워야(기억해야) 하는 것인가요? 만약에 토큰 이름이 기억 안나면 어떻게 해야 하나요? 실제 프로젝트에서 개발할 때 이 흐름과 (클래스, 토큰등의) 이름 정도는 머리속에 다 있어야 하는 것인지 궁금합니다.
- 미해결스프링 시큐리티
로그인 실패시 이동하는 주소
안녕하세요. 강의의 예제를 따라 작성해보았는데 .failureUrl .failureHandler 등을 이용해서 실패 주소를 지정해도 로그인 실패시 해당 주소로 이동하지 않고 Default 로그인 주소인 /login 으로 이동하는데 이유가 무엇인가요?
- 해결됨스프링 시큐리티
시큐리티 아키텍쳐 DelegatingFilterProxy 질문드립니다.
안녕하세요 강사님 좋은 강의 감사드립니다. 위임처리 보면서 궁금한게 있는데 web.xml 이 로드될때 서블릿 컨테이너에 DelegatingFilterProxy 를 등록되고 ApplicationContext에는 springFilterChainBean 이 등록되고DelegatingFilterProxy 은 springFilterChainBean 를 찾아서위임처리를 해주는데 이때 각각의 Filter들은 모두 스프링빈이다 라고 요약을 했는데 제대로 했는지 모르겠지만 이부분이 잘 이해가 가지않습니다.1. 스프링관련 요청은 모두 DispatchServlet를 통한다 생각하고 있었는데 여기서는 springFilterChainBean FIlter를 처리하고 이후에 해 당 request를 DispatchServlet 로 보내는것 같아서 스프링빈의 API를 호출하는것은 DispatchServlet과는 관계가 없다고 생각하면 될까요?(+ http 요청에 대한 부분만 받는건가요?)2. springFilterChainBean 도 스프링빈인데 Servlet 필터에 스프링빈을 주입만 못하는것이고 스프링빈을 가져다 쓰는것은 문제 없는거라 생각하면 될까요? 저는 지금까지 container는 모두 독립적으로 존재한다? 라고 생각을 하고 있어서 이해가 잘 되지않아 질문 드립니다감사합니다.
- 미해결스프링 시큐리티
/preAuthorize 접근 시 NullPointerException
안녕하세요. @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) 설정 후 /preAuthorize 접근하니 아래와 같이 예외가 발생하였습니다. https://github.com/pmamoon/study 에 소스를 올렸습니다. 검토 부탁드립니다. 감사합니다. java.lang.NullPointerException: null at org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl.getReachableGrantedAuthorities(RoleHierarchyImpl.java:141) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.security.access.expression.SecurityExpressionRoot.getAuthoritySet(SecurityExpressionRoot.java:167) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.security.access.expression.SecurityExpressionRoot.hasAnyAuthorityName(SecurityExpressionRoot.java:83) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.security.access.expression.SecurityExpressionRoot.hasAnyRole(SecurityExpressionRoot.java:79) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.security.access.expression.SecurityExpressionRoot.hasRole(SecurityExpressionRoot.java:75) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:130) ~[spring-expression-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:139) ~[spring-expression-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:95) ~[spring-expression-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:188) ~[spring-expression-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.expression.spel.ast.OpAnd.getBooleanValue(OpAnd.java:57) ~[spring-expression-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.expression.spel.ast.OpAnd.getValueInternal(OpAnd.java:48) ~[spring-expression-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:117) ~[spring-expression-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:302) ~[spring-expression-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean(ExpressionUtils.java:26) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.security.access.expression.method.ExpressionBasedPreInvocationAdvice.before(ExpressionBasedPreInvocationAdvice.java:59) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter.vote(PreInvocationAuthorizationAdviceVoter.java:72) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter.vote(PreInvocationAuthorizationAdviceVoter.java:40) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:63) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:233) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:65) ~[spring-security-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) ~[spring-aop-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) ~[spring-aop-5.2.1.RELEASE.jar:5.2.1.RELEASE] at io.security.corespringsecurity.aopsecurity.AopSecurityController$$EnhancerBySpringCGLIB$$b9f56cb.preAuthorize(<generated>) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888) ~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.27.jar:9.0.27] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.27.jar:9.0.27] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
- 해결됨스프링 시큐리티
chapter3 소스코드
안녕하세요 소스코드 관련해서 질문드립니다. chapter3 소스코드는 브랜치에 없는 것 같은데요. 다른 수강생분들은 어떻게 실습 하신 건지 알 수 있을까요? 따로 타이핑쳐서 공부하는 것은 당연한 것이지만 기본 소스가 없어서 어떻게 해야하는 지 답답하네요. chap4는 templates 밑에 구조가 다른 것 같더라구요. 강사님, chapter3소스 지금이라도 새로운 프로젝트로 제공해주실 수는 없으신가요?
- 미해결스프링 시큐리티
getAttributes() null 리턴과 PermitAllFilter
안녕하세요 강사님 강의를 보면 로그인 없이 /mypage에 접근하면 getAttributes()에서 null를 리턴하여 에 접근하게 됩니다. 의문이 드는 건 1. /mypage 접근할 때 인증 처리 후 인가 처리가 되어야 하는게 아닌지.. security config의 .anyRequest().authenticated() 도 무시되는 건가요? /mypage 및 DB에서 관리하지 않는 자원에 접근 시 인증 체크가 먼저 되어야 하지 않나요? 2. DB에서 관리하지 않는 자원이면 접속 가능한데 PermitAllFilter 가 왜 필요한지. PermitAllFilter 는 인가 처리의 앞단에서 다음 인가 프로세스로 넘어가지 않도록 하는 목적인가요? 3. 정적 자원 인가 getAttributes() 메서드에 값을 확인해보면 아래 로그처럼 정적 자원에 대한 인가 체크를 하고 있습니다. web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations()); 설정으로 정적 자원은 security 처리 과정에서 무시되는 것이 아닌지요? 감사합니다.
- 미해결스프링 시큐리티
method 방식과 filter 방식의 장단점
method 방식과 filter 방식이 있는데 두 방식의 장단점이 안 와닿습니다. 두 가지의 장단점을 설명해주실 수 있나요?