Thymeleaf에서 Spring Security 권한 제어: sec:authorize와 네임스페이스 사용법

  • 4 minutes to read

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()를 사용하는 것이 가장 명확하고 안정적입니다.

이러한 방식은 메뉴 노출, 버튼 제어, 안내 메시지 등 다양한 사용자 인터페이스 요소에 적용할 수 있으며, 보안성과 사용자 경험 모두를 높이는 데 기여합니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com