본문 바로가기

Language/Spring Security

인가 - Authorization

728x90
  • 인가(권한 부여)특정 자원에 접근할 수 있는 사람을 결정하는 것을 의미
  • Spring Security는 GrantedAuthority 클래스를 통해 권한 목록을 관리하고 있으며 사용자의 Authentication 객체와 연결

  • 사용자가 인증(Authentication)을 받은 뒤 해당 사용자가 어떤 권한을 가지고 어디에 접근을 할 수 있는지가 인가(Authorization)
    인증이 되어야 인가로 넘어갈 수 있음

GrantedAuthority

  • 스프링 시큐리티는 Authentication에 GrantedAuthority권한 목록을 저장하며 이를 통해 인증 주체에게 부여된 권한을 사용
  • GrantedAuthority 객체는 AuthenticationManager에 의해 Authentication 객체에 삽입
    → 스프링 시큐리티는 인가 결정을 내릴 때 AuthorizatioinManager를 사용하여 Authentication(인증 주체)으로부터 GrantedAuthority 객체를 읽어들여 처리

 

사용자 정의 역할 접두사

  • 기본적으로 역할 기반의 인가 규칙은 역할 앞에 ROLE_를 접두사로 사용
    → 즉, "USER" 역할을 가진 보안 컨텍스트가 필요한 인가 규칙이 있다면 Spring Security 는 기본적으로 "ROLE_USER“ 를 반환하는 GrantedAuthority#getAuthority를 찾음
  • GrantedAuthorityDefaults로 사용자 지정할 수 있으며 GrantedAuthorityDefaults는 역할 기반 인가 규칙에 사용할 접두사를 사용자 정의하는 데 사용


정리

  • 스프링 시큐리티는 권한을 확인하기 위해서 GrantedAuthority를 사용하여 권한 목록을 확인
  • GrantedAuthorityDefaults를 빈으로 생성하여 hasRole() 사용 시 앞에 붙는 접두사 변경 가능
    • 단, UserDetails를 생성할 때 .roles()가 아니라 .authorities("MYPREFIX_USER")와 같이 지정을 해주어야 함
      → .roles("USER") 라고 하면 자동으로 ROLE_USER라고 인증 객체의 권한에 저장이 됨
// 권한 : ROLE_USER
UserDetails user = User.withUsername("user").password("{noop}1111").roles("USER").build();

// 권한 : MYPREFIX_USER
UserDetails user = User.withUsername("user").password("{noop}1111").authorities("MYPREFIX_USER").build();
728x90