[Diary][Spring] Spring Security에서 Role과 Authority의 차이가 뭘까?
본문 바로가기

Development/Diary

[Diary][Spring] Spring Security에서 Role과 Authority의 차이가 뭘까?

문제 상황

위는 이미 해결한 PR인데, hasAnyRole을 사용하면 권한 체크가 안 되고, hasAnyAuthority를 사용해야 권한 체크가 잘 동작하는 일이 발생했다.

문제 원인

Spring Security 문서 26. Expression-Based Access Control (spring.io) << 여기를 들어가서 hasRole과 hasAnyAuthority 함수 동작의 차이를 찾아보았다. 

 

간단히 요약하면, 현재 principal에 명시된 roles 중에서

hasRole([role])
지정된 역할이 현재 사용자에게 있는 경우 true를 반환한다. 기본적으로 제공된 역할이 'ROLE_'로 시작하지 않으면, 'ROLE_'이 자동으로 추가된다.

 

hasAuthority([authority])
지정된 권한이 현재 사용자에게 있는 경우 true를 반환한다.

하지만 UserRoleEnum 에서는 ROLE_을 붙이고 있지 않고, 이를 UserDetailsImpl.getAuthorities()에서 SimpleGrantedAuthority로 만들었기 때문에,

hasAnyRole("MASTER")의 경우 "ROLE_MASTER"로 찾게 되어 권한 체크가 안 되었다.

 

이 때문에 hasAnyAuthority를 사용해야 했다.

문제 해결

SimpleGrantedAuthority에서 role의 값을 ROLE_로 했다면 hasRole을, 붙이지 않았다면 hasAuthority를 사용하자.

Role과 Authority의 개념적 차이?

 

권한(authority):

  • 권한은 사용자에게 부여된 세부적인 권한이나 특권을 나타낸다.
  • 일반적으로 애플리케이션 내 특정 메서드나 리소스에 대한 액세스를 제어하는 데 사용된다.

역할(roles)

  • 역할은 권한의 모음 또는 그룹을 나타냅다. 일반적으로 시스템 내에서 사용자의 위치나 책임을 설명하는 더 높은 수준의 개념이다.
  • 역할은 종종 사용자에게 할당할 수 있는 Authority 그룹을 정의하는 데 사용된다. 예를 들어, ROLE_ADMIN 역할은 READ_PRIVILEGES, WRITE_PRIVILEGES, DELETE_PRIVILEGES와 같은 권한을 포함할 수 있다.