권한(Authority)
- 정의: 권한은 사용자가 가질 수 있는 개별 특권이나 웹 애플리케이션 내에서 사용자가 수행할 수 있는 개별 작업을 나타냅니다.
- 예시: VIEWACCOUNT, VIEWCARDS, VIEWLOANS 등. 이 권한들을 통해 사용자는 특정 작업을 수행할 수 있습니다.
- 세밀한 접근 제한: 권한은 개별 작업이나 특권을 나타내므로, 세밀한 방식으로 접근을 제한하는 데 사용됩니다. 예를 들어, 사용자가 특정 계정 정보를 보기 위해서는 VIEWACCOUNT 권한이 필요합니다.
역할(Role)
- 정의: 역할은 여러 권한의 그룹을 나타냅니다. 즉, 하나의 역할은 여러 권한을 포함할 수 있습니다.
- 예시: ROLE_ADMIN, ROLE_USER 등. 이러한 역할은 여러 권한을 묶어서 한 번에 부여할 수 있습니다.
- 대략적인 접근 제한: 역할을 사용하면 여러 권한을 하나로 묶어 관리할 수 있으므로, 권한을 세밀하게 관리하지 않고도 대략적인 접근 제한을 설정할 수 있습니다. 예를 들어, ROLE_ADMIN은 VIEWACCOUNT, EDITACCOUNT, DELETEACCOUNT와 같은 여러 권한을 포함할 수 있습니다.
- spring Security에서는 역할 이름에 ROLE_ 접두사를 붙이는 것이 관례입니다. 예를 들어, "ADMIN" 역할은 "ROLE_ADMIN"으로 저장됩니다. 이는 역할과 권한을 구분하기 위한 표준입니다.
- 역할의 접두사: Spring Security는 역할을 나타내는 문자열에 ROLE_ 접두사를 사용합니다. 예를 들어, "ADMIN" 역할은 내부적으로 "ROLE_ADMIN"으로 처리됩니다.
- 메소드 사용 시 접두사 생략: hasRole(), hasAnyRole(), access() 메소드를 사용할 때는 역할 이름에 ROLE_ 접두사를 붙일 필요가 없습니다. Spring Security가 내부적으로 자동으로 이 접두사를 추가해줍니다.
// 역할 부여 예제에서 'ROLE_ADMIN' 역할을 사용자에게 부여
List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
return new User(user.getUser_email(), user.getUser_password(), authorities);
// hasRole() 메소드 사용 예제
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
Spring Security에서의 권한과 역할
- 권한 및 역할 이름의 표준: Spring Security에서는 특정 문자열이 권한인지 역할인지를 구별하기 위해 표준을 강제하고 있습니다. 역할은 항상 ROLE_ 접두사로 시작해야 합니다. 예를 들어, ROLE_ADMIN은 역할을 나타내고, VIEWACCOUNT는 권한을 나타냅니다.
- GrantedAuthority 인터페이스: Spring Security에서 권한과 역할은 GrantedAuthority 인터페이스를 사용하여 표현됩니다. SimpleGrantedAuthority 클래스는 이 인터페이스의 간단한 구현체로, 권한과 역할을 문자열로 감싸서 처리합니다.
권한과 역할의 사용 예시
- 데이터베이스 관리: 권한을 관리하기 위해 데이터베이스에서 AUTHORITIES 테이블을 사용할 수 있습니다. 이 테이블에 ROLE_USER와 ROLE_ADMIN 같은 역할을 저장하고, 이를 사용자에게 부여할 수 있습니다.
- 권한 부여: 사용자의 권한을 부여할 때는, 사용자에게 필요한 권한 또는 역할을 GrantedAuthority 리스트에 추가하고, 이를 UserDetails 객체로 반환하여 Spring Security에서 사용합니다.