인프런 커뮤니티 질문&답변
getAttributes() null 리턴과 PermitAllFilter
작성
·
347
0
안녕하세요 강사님
강의를 보면 로그인 없이 /mypage에 접근하면 getAttributes()에서 null를 리턴하여 에 접근하게 됩니다.
의문이 드는 건
1. /mypage 접근할 때 인증 처리 후 인가 처리가 되어야 하는게 아닌지..
security config의 .anyRequest().authenticated() 도 무시되는 건가요? /mypage 및 DB에서 관리하지 않는 자원에 접근 시 인증 체크가 먼저 되어야 하지 않나요?
2. DB에서 관리하지 않는 자원이면 접속 가능한데 PermitAllFilter 가 왜 필요한지.
PermitAllFilter 는 인가 처리의 앞단에서 다음 인가 프로세스로 넘어가지 않도록 하는 목적인가요?
3. 정적 자원 인가
getAttributes() 메서드에 값을 확인해보면 아래 로그처럼 정적 자원에 대한 인가 체크를 하고 있습니다.
web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations()); 설정으로 정적 자원은
security 처리 과정에서 무시되는 것이 아닌지요?
감사합니다.
답변 1
0
네
1. /mypage 접근할 때 인증 처리 후 인가 처리가 되어야 하는게 아닌지..
스프링 시큐리티에서는 인증 자체도 권한의 범주안에 포함됩니다.
즉 인증된 사용자 자체가 인증되었다는 권한을 가진다는 의미입니다.
그렇기 때문에 security config의 .anyRequest().authenticated() 구문은 인증된 사용자가 아니면 어떠한 자원에도 접근이 되지 않는다는 의미의 권한으로 정의 될 수 있습니다.
다만 위의 구문을 처리하는 클래스는 표현식을 처리하는 ExpressionBasedFilterInvocationSecurityMetadataSource 클래스가 담당하고 있습니다.
그런데 DB 와 연동해서 권한과 자원에 대한 제어를 하는 클래스는 사용자가 직접 구현한 UrlFilterInvocationSecurityMetadataSoruce 가 처리하도록 되어 있기 때문에 security config의 .anyRequest().authenticated() 구문을 해석할 수가 없고 또한 security config의 .anyRequest().authenticated() 구문에 대한 참조 자체를 하지도 않습니다.
그렇기 때문에 인증을 받지 않는 사용자도 UrlFilterInvocationSecurityMetadataSoruce 에서 참조하고 있지 않은 자원에 접근을 해도 통과가 되어 버립니다.
즉 인증 사용자 및 비인증 사용자 모두 DB 에서 관리하는 자원과 권한의 정책에 따라 접근여부를 결정해야 합니다.
2. DB에서 관리하지 않는 자원이면 접속 가능한데 PermitAllFilter 가 왜 필요한지.
PermitAllFilter 는 인가 처리의 앞단에서 다음 인가 프로세스로 넘어가지 않도록 하는 목적인가요?
네 맞습니다.
PermitAllFilter 는 인가 프로세스 단계로 넘어가기 전 단계에서 권한 처리를 하는 역할을 합니다.
DB 에서 관리하지 않는 자원인데도 불구하고 인가 프로세스의 모든 과정을 거치게 되는 것이 비효율적이라 판단해서 앞 단계에서 미리 처리한다는 의미로서 PermitAllFilter 의 기능을 추가했다고 보시면 되겠습니다.
3. 정적 자원 인가
네 그렇습니다.
web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations());
은 스프링 시큐리티의 보안 Filter를 거치지 않도록 하는 설정입니다.
즉 인증 및 인가 처리에서 모두 제외되도록 내부적으로 처리가 됩니다.





상세한 답변 감사합니다.
3번에 대해 다시 질문 드립니다.
getAttributes() 메서드 request.getRequestURI() 에는 /js/jquery .. 등등의 정적 자원 접근도 로그 화면을 보시면 DB 자원과 비교를 하고 있습니다.
/js, /css 등의 정적자원 접근은 UrlFilterInvocationSecurityMetadatsSource 까지 넘어가지 않아야 하는 게 아닌지요?
감사합니다.