Programming-[Backend]/Spring Security 25

[스프링 시큐리티]25. Method 방식 : Map 기반 DB 연동

1. 원리 이해 이번에는 Method 방식을 적용하되, 어노테이션을 따로 추가하지 않고 DB에 저장된 resource-role 정보를 받아와서 특정 method에 권한 설정을 해주는 방식을 공부한다. 우선 원리 이해를 위해서 여지껏 공부해온 url방식과 method 방식의 작동 원리를 도식화하여 비교해본다. url 방식 url 방식에서 요청이 들어오면, FilterSecurityInterceptor를 상속한 객체가 FilterInvocationSecurityMetadataSource 정보를 받았다. 이 정보 안에 RequestMap이라는 Resource-Role 관계 정보가 담겨져 있었고, 이것을 DB로부터 받아서 인가처리를 하는데 사용했다. 실습때 SecurityConfig 설정파일에서 customFi..

[스프링 시큐리티]24. Method 방식 : 어노테이션 API 이해

1. 권한 종류 권한 어노테이션의 종류 @PreAuthorize, @PostAuthorize SpEL(Spring Expression Language)을 지원한다. @PreAuthorize("hasRole('ROLE_USER')and(#account.username == principal.username)") 과 같이 쓸 수 있다. PrePostAnnotationSecurityMetadataSource가 처리한다. @Secured, @RolesAllowed SpEL을 지원하지 않는다. @Secured("ROLE_USER"), @RolesAllowed("ROLE_USER")처럼 쓸 수 있다. SecuredAnnotationSecurityMetadataSource, Jsr250MethodSecurityMet..

[스프링 시큐리티]23. Method 방식 : 동작방식 및 구조 알아보기

1. 개요 페이지별 즉 화면 단위별 인가처리를 하는 것이 아니라 메소드 단위로 인가처리를 적용할 수 있는 방법이다. 예를 들어서 UserServiceImpl에 아래 처럼 order 메서드를 추가할 수 있다. 그리고 @Secured라는 어노테이션을 적용해서 해당 method에 접근할 때는 "ROLE_MANAGER" 권한이 있는지 검사하도록 할 수 있는 것이다. 어떠 방식으로 동작하는 지 그 구조와 원리에 대해서 학습해본다. @Override @Secured("ROLE_MANAGER") public void order() { System.out.println("order"); } 2. 동작 방식 서버를 실행할 때 초기화가 진행된다. 초기화 때 보안 어노테이션이 있는 빈의 프록시 객체를 만들고, 여기에 인가처..

[스프링 시큐리티]22. 아이피 접속 제한 ; AccessDecisionVoter 추가

1. Voter에 의한 인가 처리 방식 Voter에 의한 인가처리는 AccessDecisionManager에 의해 접근을 검사하는 것이고, 앞선 글의 계층 권한 처리에서 살펴본 것과 같은 방식으로 처리한다. 따라서 추가적인 Voter 구현체로 IpAddressVoter를 만들어주면 된다. 다시 말해 RoleHierarchyVoter 외에 IpAddressVoter를 추가하여 접속자의 Ip도 검사하는 방식이 된다. Voter의 결과 리턴값 public interface AccessDecisionVoter { int ACCESS_GRANTED = 1; int ACCESS_ABSTAIN = 0; int ACCESS_DENIED = -1; boolean supports(ConfigAttribute var1); ..

[스프링 시큐리티]21. 계층 권한

1. 계층 권한 적용 : RoleHierarchy, RoleHierarchyVoter 개념 User, Manager, Admin 권한이 있을 때, 보통은 Admin 권한이 있다면 User, Manager 권한을 갖도록 설계하는 것이 보통이다. 이런 권한 계층 관리를 해주는 것이 RoleHierarchy 객체이다. Rolehierarchy 객체는 String 구문으로 작성된다. 예를 들면 다음과 같다. ROLE_ADMIN > ROLE_MANAGER ROLE_ADMIN > ROLE_USER 부등호와 줄바꿈(\N) 기호를 통해서 구분하며, 하나의 String으로 작성되어야 한다. 부등호가 큰 쪽이 상위 계층이라는 의미가 된다. 이렇게 작성된 RoleHierarchy 객체를 RoleHierarchyVoter에 ..

[스프링 시큐리티]20. 실시간 권한 업데이트, 허용필터

1. 실시간 처리 실시간 처리는 관리자가 DB에 자원/권한 정보를 업데이트 할 때, 실시간으로 앞서 작성한 ResourceMap에 업데이트를 해서 사용자들이 웹 사이트를 이용하는데 문제가 없도록 하는 작업이다. reload 메서드 추가 처리를 위해서 UrlFilterInvocationMetadataSource에 reload 메서드를 추가한다. iterator를 활용하는 문법에 유의하자. public void reload() { LinkedHashMap reloadedMap = securityResourceService.getResourceList(); Iterator iterator = reloadedMap.entrySet().iterator(); requestMap.clear(); //기존 정보를 지움..

[스프링 시큐리티]19. DB 연동 인가처리 -FilterInvocationSecurityMetadataSource 구현

1. DB 연동 : requestMap 가져오기 requestMap.put(new AntPathRequestMatcher("/mypage"), Arrays.asList(new SecurityConfig("ROLE_USER"))); 이제 UrlFilterInvocationMetadataSource에 위와 같이 강제로 url과 권한을 삽입하는 것이 아니라 DB에 있는 role-resource 정보를 넣어주는 것을 실습해본다. 우선 유저가 요청한 request url에 따라 해당 url에 접근 가능한 role들을 정의하는 requestMap 객체를 가져오는 코드를 작성해본다. SecurityConfig 수정 지난 글 맨 마지막 부분에서 SecurityConfig 파일의 customFilterSecurityIn..

[스프링 시큐리티]18. DB 연동 인가처리 - 스프링 MVC 복습, FilterInvocationSecurityMetadataSource 기초 구현

0. 소스 코드 수정 강의에서 DB 연동 처리를 하기 위해서 JPA를 사용하였다. 그런데 2년 전 강의라 그런지, Entity 구조상 @ManyToMany 등 JPA 안티패턴이 있고 잘못된 부분들이 좀 있어서 Entity 및 전체 구조를 적절히 수정했다. 아래 주소의 레포지토리 - master branch에 수정된 파일들을 담았다. (원본은 keep 브랜치) https://github.com/CJ0823/corespringsecurity 복습도 할겸, thymeleaf와 controller 코드를 잠시 살펴보자. 강의 소스코드에는 권한을 등록하는 admin/role/register 주소의 view 파일이 존재하지 않았다. 그래서 detail.html 파일을 복사해서 조금 바꿔주었다. register.ht..

[스프링 시큐리티] 17. Ajax 인증 구현 - DSL, CSRF

1. DSL DSL(Domain-specific language, 도메인 특화 언어)는 특정화된 도메인을 적용하는데 특화된 언어이다. HTML과 같이 웹 전체에서 널리 쓰이는 언어의 개념이 아니라 특정한 도메인에서만 쓰이는 언어라고 보면 된다. 지금 학습하고 있는 맥락에서 이해하자면, filter나 handler 등의 http. 환경설정 메서드의 set를 만든다고 생각하면 될 것 같다. spring security를 전반적으로 다 이해하고 환경설정 set를 만들어서 활용할 정도가 되어야 사용할 것 같다. 그래서 이 부분은 가볍게 이해하고 넘어가면 될 것 같다. AbstractHttpConfigurer 초기화를 위한 설정 클래스이다. 이 클래스를 이용해서 스프링 시큐리티의 환경설정 set를 만든다. con..

[스프링 시큐리티] 16. Ajax 인증 구현 - 인증, 인가 처리

1. 인증 처리 : AuthenticationSuccessHandler & AuthenticationFailureHandler From 인증과 같이 인증 성공과 실패 시 handler를 적용한다. Form 인증 방식과 다를 게 없고, View 형태로 응답하는 것이 아니라 response의 body에 정보를 담아서 보내주는 형태이다. AuthenticationSuccessHandler response에 정보를 담기 위해서 ObjectMapper를 불러온다. 그리고 앞선 글에서 살펴본 AuthenticationManager에서 성공한 인증 객체, authentication을 받아와서 Account 객체로 만들어서 응답값으로 반환한다. public class AjaxAuthenticationSuccessHan..