모르지 않다는 것은 아는것과 다르다.

전체 글 224

ProxyFactory 를 이용한 동적 Method 인가 처리

개요 메소드에 실시간으로 보안처리를 하고 싶다. url 인가 처리의 경우 필터기반이기 때문에, 매 요청시 인가처리를 할 수 있지만, 메소드 인가 처리는 AOP 기반이기 때문에, 애플리케이션이 구동되는 시점, 즉 초기화 시점에서 프록시 객체와 Advice 가 등록이 되어있어야 한다. 그렇기 때문에 메소드 인가 처리를 동적으로 처리하기 위해서는 실시간으로 프록시 객체를 생성하고 Advice 를 등록하는 로직이 필요하다. AOP 와 ProxyFactory 코드 구현 @Component public class MethodSecurityService { private MapBasedMethodSecurityMetadataSource mapBasedMethodSecurityMetadataSource; private..

Spring Security 2022.02.28

Method 시큐리티 프로세스 커스텀

개요 Method 레벨에서 시큐리티를 적용시키고 싶다. Method 시큐리티는 AOP 기반으로 구현되어있다. Method 시큐리티와 AOP Method 시큐리티에서 AOP 적용 원리는 아래와 같다. ProxyFactory 에서 프록시 객체를 생성한다. 프록시 객체는 advisor 를 통해서 advice 를 실행시킨다. Pointcut 으로 설정된 부분에서 인가를 처리한다. 인가처리가 끝난 후 프록시 객체가 아닌 실제 클래스의 메소드를 실행한다. Method 에 애노테이션 방식의 권한 설정 보안이 필요한 메소드에 설정한다. @PreAuthorize, @PostAuthorize, @Secured, @RolesAllowed 등이 있다. @PreAuthorize, @PostAuthorize SpEL 지원 Pre..

Spring Security 2022.02.28

URL 시큐리티 프로세스 커스텀

개요 SecurityConfig 파일에서 하나하나 mvcMatchers("/admin").hasRole("ADMIN") 이렇게 처리해 주지 않고, 동적으로 처리해주고 싶을 때가 있을것이다. Spring Security 를 통해서 동적으로 권한을 부여해 줄 수 있도록 커스텀할 수 있다. 인가 처리 방식 아래 그림은 인가 처리 방식을 나타낸 그림이다. FilterInvocation 요청 정보를 담는 객체이다. FilterInvocation 객체는 FilterSecurityInterceptor 의 doFilter 메소드 안에 있다. List attributes 권한 정보를 담는 객체이다. this.obtainSecurityMetadataSource().getAttribute(object); 에서 권한 정보를 ..

Spring Security 2022.02.28

권한 계층 적용하기

개요 상윈 권한이 하위 권한을 포함할 수 있도록 설정할 수 있다. 권한 계층 적용 RoleHierarchy 클래스는 상위 계층 Role은 하위 계층 Role의 자원에 접근 가능하도록 설정할 수 있는 클래스다. 예를들어 ROLE_ADMIN > ROLE_MANAGER > ROLE_USER 일 경우 ROLE_ADMIN 만 있으면 하위 ROLE 의 권한을 모두 포함되게 설정할 수 있다. ROLE_HIERARCHY 테이블을 보면 부모와 자식 권한이 매핑되어 저장되어 있다. ROLE_HIERARCHY 테이블에 저장된 정보는 정해진 format에 따라 포매팅 되어야 한다. 포매팅된 데이터는 RoleHierarchy 가 가지고 있게 된다. RoleHierarchyVoter 는 RoleHierarchy 를 생성자로 받으..

Spring Security 2022.02.28

Voter 커스텀 하기

개요 Voter 를 커스텀해서 IP 를 검증하는 로직을 추가할 수 있다. Voter custom 하기 특정한 IP 만 접근이 가능하도록 하고 싶다면, IP 를 심의하는 Voter 추가하면 된다. AccessDecisionManager 의 구현체중 AffirmativeBased 가 기본적략이기 때문에 Voter 중 하나만 통과되도 허용된다. 또한 나는 직접 만든 IpAddressVoter 에서 허용되지 않으면, 바로 자원접근을 거부하고 싶다. 그렇기 때문에 아래와 같은 규칙이 필요하다. AffirmativeBased 에서 직접만든 IpAddressVoter 를 우선적으로 체크해야 되기 때문에 가장 상위에 위치시켜서 먼저 검사하도록 설정해야 한다. 허용된 IP의 경우 ACCESS_GRANTED 가 아닌 AC..

Spring Security 2022.02.28

@AuthenticationPrincipal

개요 아래와 같이 웹 MVC 핸들러 아규먼트로 Principal 객체를 받을 수 있다. @GetMapping("/") public String index(Model model, Principal principal){ if (principal == null){ model.addAttribute("message", "null"); }else { model.addAttribute("message", "hello" + principal.getName()); } } 여기서 Principal 대신 Account 를 받을 수 없을까? -> @AuthenticationPrincipal 를 사용하면 된다. @AuthenticationPrincipal SecurityContextHolder.getContext().getA..

Spring Security 2022.02.28

메소드 시큐리티

메소드 시큐리티 서비스 계층을 직접 호출할 때 사용하는 보안 기능이다. AOP 를 이용해서 적용시킨 것이다. @Configuration @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, jsr250Enabled = true) public class MethodSecurity extends GlobalMethodSecurityConfiguration { @Override protected AccessDecisionManager accessDecisionManager() { RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl(); roleHierarchy.setHierarchy(..

Spring Security 2022.02.28

Custom DSL 적용

개요 Spring Security 에서 제공하는 DSL(Doman Specific Language) 을 적용해 보고자한다. 폼인증 기반 필터가 아닌 직접만든 AjaxAuthenticationFilter 를 대상으로 구현해 볼 것이다. Ajax Custom DSLs 구현 스프링 시큐리티에서 제공하는 DSL 로 Config 를 구성하면 필터, 핸들러, 메서드, 속성 등을 한 곳에 정의하여 처리할 수 있는 편리함 제공한다. AjaxLoginConfigurer 구현 public final class AjaxLoginConfigurer extends AbstractAuthenticationFilterConfigurer { private AuthenticationSuccessHandler successHandler..

Spring Security 2022.02.28

Ajax 인증처이

Ajax 인증 처리 흐름 보는 것 처럼 인증의 경우 AjaxAuthenticationFilter 로 인가의 경우 FilterSecurityIntercepter 로 요청이 전달 되는 것을 확인할 수 있다. ajax 방식으로 구현하기 위해서 각각의 클래스 구현해 줘야 하지만, 방식은 폼인증 방식과 크게 다르지 않다. AbstractAuthenticationProcessingFilter 상속해서 구현할 수 있다. AjaxAuthenticationFilter 구현 폼인증 필터를 사용할 수 없기 때문에 AjaxLoginProcessingFilter 클래스 구현한다. public class AjaxLoginProcessingFilter extends AbstractAuthenticationProcessingFilt..

Spring Security 2022.02.28

Custom Filter

Custom Filter 구현 Spring Security Custom Filter 를 만들 수 있다. 기본적은 서블릿 필터를 만드는 것과 동일하다. 아래와 같이 구현할 수 있다. public class LoggingFilter extends GenericFilter { private Logger logger = LoggerFactory.getLogger(this.getClass()); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { StopWatch stopWatch = new StopWatch(); st..

Spring Security 2022.02.28