표현식 기반 접근 제어

귀찮Lee·2022년 7월 26일
0

Spring Security

목록 보기
6/13
post-custom-banner

◎ Expression-Based Access Control

  • 스프링 시큐리티 3.0부터 간단한 설정 속성과 voter로 접근 권한을 결정하는 방법 외에도 스프링 EL 표현식을 사용해 인가 메커니즘을 구현 가능
  • 복잡한 Boolean 로직을 간단한 표현식 하나로 캡슐화 가능

◎ 스프링 EL 표현식

  • Spring Security는 스프링 EL 표현식을 사용
  • 표현식을 평가할 땐 평가 컨텍스트의 일부로 루트 객체를 사용
  • 스프링 시큐리티는 웹과 메서드 시큐리티 전용 클래스를 루트 객체로 사용하기 때문에 별도의 내장 표현식을 사용 가능하며 principal 등에 접근할 수 있다.

◎ 스프링 EL 표현식 종류

표현식설명
hasRole(Stirng role)- 현재 보안 주체(principal)가 지정된 역할을 갖고 있는지 여부를 확인하고 가지고 있다면 true를 리턴한다.
- hasRole(’admin’)처럼 파라미터로 넘긴 role이 ROLE_ 로 시작하지 않으면 기본적으로 추가
- DefaultWebSecurityExpressionHandler의 defaultRolePrefix를 수정하면 커스텀 가능
hasAnyRole(String… roles)- 현재 보안 주체가 지정한 역할 중 1개라도 가지고 있으면 true를 리턴
- 문자열 리스트를 콤마로 구분해서 전달
ex) hasAnyRole(’admin’, ‘user’)
hasAuthority(String authority)현재 보안 주체가 지정한 권한을 갖고 있는지 여부를 확인하고 가지고 있다면 true를 리턴
ex) hasAuthority(’read’)
hasAnyAuthority(String… authorities)현재 보안 주체가 지정한 권한 중 하나라도 있으면 true를 리턴한다.
ex) hasAnyAuthority(’read’, ‘write’)
principal현재 사용자를 나타내는 principal 객체에 직접 접근 가능
authenticationecurityContext로 조회할 수 있는 현재 Authentication 객체에 직접 접근 가능
permitAll항상 true
denyAll항상 false
isAnonymous()현재 보안 주체가 익명 사용자면 true
isRememberMe()현재 보안 주체가 remember-me 사용자면 true
isAuthenticated()사용자가 익명이 아닌 경우 true
isFullyAuthenticated()사용자가 익명 사용자나 remember-me 사용자가 아니면 true
- hasPermission(Object target, Object permission)
- hasPermission(Object targetId, String targetType, Object permission)
사용자가 target에 해당 permission 권한이 있으면 true
ex) hasPermission(domainObject, ‘read’)
ex) hasPermission(1, ‘com.example.domain.Message’, ‘read’)

◎ 메서드 보안 표현식

  • 메서드 보안 표현식

    • 메서드 시큐리티는 단순한 허가 또는 거절보다 조금 더 복잡한 규칙을 사용
    • Spring Security 3.0은 표현식을 종합적으로 지원하기 위한 새로운 애노테이션을 도입
    • 메서드, 클래스나 인터페이스에 사용 가능
  • 메서드 보안 표현식 종류

    • @Secure : 1개의 권한을 주고 싶을 때
    • @PreAuthorize : 1개 이상의 권한을 주고 싶을 때 사용
    • @PostAuthorize : 메서드가 실행되고 응답하기 직전에 권한을 검사하는데 사용, 권한이 없으면 예외를 던짐
    • @PostFilter : 값 파라미터로 SpEL 표현식을 가짐. 메소드 엑세스 제한 대신, 각 컬렉션 값 멤버에 대한 표현식이 메소드로부터 반환되는지 검증 후, 결과가 false이면 제거
    • @PreFilter : @PostFilter와 반대로, 사전에 필터링을 한 후에 적용
    • 참고 자료

◎ 스프링 EL 표현식 적용

profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!
post-custom-banner

0개의 댓글