Backend/SpringBoot

Security 에서 Role 적용시 헷갈리는 부분 정리

Dean83 2026. 1. 28. 15:04

보통, User의 Role을 이용할 경우, enum을 통해서 ADMIN, USER 처럼 정의하고 이용하게 된다. DB에도 이렇게 저장된다.
그러나 권한 확인 메소드인 hasRole 같은 경우에는 자동으로 앞에 "ROLE_" 문자열을 붙여서 비교하게 된다. 

 

사용자 인증 할때 보통 Custom 한 UserDetails 를 구현한 구현체 구성을 하게 되는데, 오버라이드 한 메소드 중 아래 메소드에서

"ROLE_" 문자열을 붙여줘야 한다.

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    if(userDto == null)
        return List.of();

    return List.of(new SimpleGrantedAuthority("ROLE_" + userDto.getRole()));
}

 

이제 이 경우, 어느 Role 에서는 ROLE_가 붙고, 어디서는 enum값 그대로 쓸 수 있는지 헷갈리게 된다.

간략히 요약하자면, 

  • SecurityContext에 저장된 항목 : ROLE_ 가 붙어 있음
  • 그외 개발자가 개발한 API, 엔티티 등 항목 : ROLE_가 붙어있지 않음

 

 

다시 요약하자면, 

  • DB, 엔티티에는 Enum에서 명시한 Role 이름 그대로.
  • UserDetails를 구현한 구현체에서 ROLE_ 문자열 붙이기
  • 이후 SecurityContext 에 저장된 Role을 가져올 경우에는 ROLE_이 붙어있음 (GrantedAuthority 관련된 항목들)
    • 단, SecurityContext에 Dto를 저장했다면, 해당 Dto에 있는 role 은 enum 그대로
    • Authentication의 getPrincipal 메소드는 ROLE_
  • hasRole() 메서드를 이용하는 경우에는 자동으로 ROLE_가 붙음