Thymeleaf에서 Spring Security 권한 제어: sec:authorize
와 네임스페이스 사용법
Spring Boot와 Thymeleaf를 함께 사용할 경우, Spring Security와의 연동을 통해 뷰(View)에서 인증 및 권한 기반으로 사용자 인터페이스를 제어할 수 있습니다. 이때 사용하는 대표적인 기능이 sec:authorize
속성과 네임스페이스 선언(xmlns:sec
)입니다.
본 문서에서는 역할 이름을 Administrators
, Users
, Guests
와 같은 그룹 기반으로 사용하는 경우에 맞추어 이 기능의 사용 방법과 권장 사항을 정리합니다.
1. 네임스페이스 선언: xmlns:sec
Thymeleaf 템플릿에서 Spring Security의 확장 기능을 사용하려면 HTML 문서 상단에 다음과 같은 네임스페이스 선언이 필요합니다.
<html xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
설명
sec:
접두사는 Spring Security와의 통합 기능을 활성화합니다.- 이를 통해
sec:authorize
,sec:authentication
,sec:csrf
등의 속성을 사용할 수 있습니다.
2. 권한 제어: sec:authorize
sec:authorize
속성은 해당 HTML 요소의 렌더링 여부를 현재 사용자에게 부여된 권한에 따라 제어합니다.
사용자 역할이 Administrators
, Users
, Guests
등으로 설정되어 있다면, 다음과 같이 조건을 지정할 수 있습니다.
예시
<!-- 'Administrators' 권한을 가진 사용자만 볼 수 있는 메뉴 -->
<div sec:authorize="hasAuthority('Administrators')">
관리자 전용 메뉴
</div>
- 위의 예시는 로그인한 사용자가
Administrators
권한을 가지고 있는 경우에만 해당 요소가 출력됩니다. - 조건이 충족되지 않으면, 해당 HTML 태그는 렌더링 결과에서 완전히 제거됩니다.
3. hasAuthority
vs hasRole
의 차이점
Spring Security는 권한 검사 시 hasAuthority()
와 hasRole()
두 가지 표현식을 제공합니다.
역할 이름을 Administrators
, Users
, Guests
처럼 접두어 없이 직접 지정한 경우, hasAuthority()
를 사용하는 것이 적절합니다.
표현식 | 비교 대상 | 내부 처리 방식 |
---|---|---|
hasRole('Administrators') |
ROLE_Administrators 로 변환 |
ROLE_ 접두어 자동 추가 |
hasAuthority('Administrators') |
Administrators 그대로 사용 |
접두어 없이 정확히 일치해야 함 |
추천 방식
<!-- 권한 이름을 그대로 비교 -->
<span sec:authorize="hasAuthority('Users')">일반 사용자 메뉴</span>
4. 다양한 조건 표현식 예시
표현식 | 설명 |
---|---|
isAuthenticated() |
로그인한 사용자일 경우 출력 |
isAnonymous() |
로그인하지 않은 사용자일 경우 출력 |
hasAuthority('Users') |
Users 권한을 가진 사용자 |
hasAuthority('Guests') |
Guests 권한을 가진 사용자 |
5. 역할별 UI 제어 예시
<!-- 관리자만 볼 수 있는 영역 -->
<div sec:authorize="hasAuthority('Administrators')">
시스템 설정
</div>
<!-- 일반 사용자만 볼 수 있는 영역 -->
<div sec:authorize="hasAuthority('Users')">
내 정보 보기
</div>
<!-- 비회원(게스트)만 볼 수 있는 영역 -->
<div sec:authorize="isAnonymous()">
회원 가입하기
</div>
6. 결론
Thymeleaf에서 sec:authorize
속성과 xmlns:sec
네임스페이스를 함께 사용하면 뷰 단에서도 Spring Security의 인증 및 권한 검사를 반영할 수 있습니다.
특히 사용자 역할을 Administrators
, Users
, Guests
처럼 접두어 없이 명시적으로 정의한 경우, hasAuthority()
를 사용하는 것이 가장 명확하고 안정적입니다.
이러한 방식은 메뉴 노출, 버튼 제어, 안내 메시지 등 다양한 사용자 인터페이스 요소에 적용할 수 있으며, 보안성과 사용자 경험 모두를 높이는 데 기여합니다.