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

Spring Security 27

스프링시큐리티 테스트

스프링시큐리티 테스트 SpringSecurity를 사용하는 프로젝트의 테스트는 SpringSecurity가 없는 프로젝트의 테스트와 조금 다른 부분이 있다. SpringSecurity의 테스트에서는 User가 로그인한 상태를 가정하고 테스트해야 하는 경우가 많다. 인증을 받지 않은 상태로 테스트를 하면 SpringSecurity에서 요청 자체를 막기 때문에 테스트가 제대로 동작조차 하지 못한다. 이런 문제는 프로젝트에 spring-security-test를 사용해서 해결할 수 있다. 설정 의존성 추가 testImplementation 'org.springframework.security:spring-security-test' Test 실행 전 MockMvc에 springSecurity (static 메소..

Spring Security 2022.03.24

PasswordEncoder

PasswordEncoder 란? spring security 를 사용할때 패스워드를 암호화하는 전략을 정할 수 있다. 아래와 같이 PasswordEncoder 를 빈으로 등록한다. @Bean public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } PasswordEncoder 전략 아래와 같이 5가지의 전략을 갖는다. NoOpPasswordEncoder 암호화하지 않고 평문으로 사용한다. password가 그대로 노출되기 때문에 현재는 deprecated 되었고 사용하지 않기를 권장한다. BcryptPasswordEncoder Bcrypt 해시 함수를 사용한 P..

Spring Security 2022.03.24

JWT

JWT 란? JWT는 Json Web Token 의 약자이다. Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달한다. JWT는 아래와 같이 Header, Payload, Signature 으로 구성되어 있고, 3 부분을 . 구분자로 구분하며, Json 형태인 각 부분은 Base64로 인코딩 되어 표현된다. Base64는 암호화된 문자열이 아니고, 같은 문자열에 대해 항상 같은 인코딩 문자열을 반환한다. 세션 vs JWT 세션 방식 먼저 세션 방식으로 인증을 처리하는 과정은 아래와 같다. 위와 같이 먼저 클라이언트 측에서 로그인을 시도한다. 회원 정보가 일치하면 서버..

Spring Security 2022.02.28

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