웹 개발/Spring Boot

[Spring Boot] Spring Security sec:authorize 오류 해결 방법

끈끈E 2025. 5. 7. 00:27

Spring boot 프로젝트를 진행하며 Spring Security를 활용해 authentication 관련 기능들을 구현했다.
이를 웹 뷰에 적용하여 활용하려고 하였다.

<th:block sec:authorize="isAuthenticated()">
    <span>안녕하세요, <strong sec:authentication="name">사용자</strong>님</span>
    <a th:href="@{/mypage}">마이페이지</a>
    <a th:href="@{/logout}">로그아웃</a>
</th:block>

<th:block sec:authorize="isAnonymous()">
    <a th:href="@{/login}">로그인</a>
    <a th:href="@{/signup}">회원가입</a>
</th:block>


위와 같이 간단히 기능을 구현했다.
isAuthenticated()는 사용자가 권한이 있을경우 보이는 블럭이고
isAnonymous()는 로그인하지 않은 사용자일 경우 보이는 블럭이다.

 

따라서 의도대로라면 로그인하지않은 사용자가 접속하면 로그인 / 회원가입이 보이고
로그인 한 사용자가 접속하면 안녕하세요, 000님 / 마이페이지 / 로그아웃 이 보여야한다. 

 

하지만 실행결과 두 블럭이 전부 출력되었다. 
상황을 분석해보니 Spring Security 의존성도 잘 등록하고 UserDetails 인터페이스도 잘 구현했기 때문에 문제될 것이 없었다.

 

현재 개발환경은 웹 템플릿에 thymeleaf를 사용하며 Spring 3.4.4,  Spring Security 6.4.4 버전을 사용했다.

정리해보자면 문제 원인은 다음 중 하나이다.

 


1. html 파일에서 prefix 미선언 혹은 문법 오류

xmlns:sec="http://www.thymeleaf.org/extras/spring-security"

위와 같이 prefix를 선언해야 한다.

 


2. Spring Security 관련 의존성 등록 유무 

- build.gradle에 다음과 같이 의존성을 잘 등록해야한다.

implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'

본인은 이 단계에서 문제를 해결했다. 다른 글에서 springsecurity5를 선언했는데 이를 따라 적용해보니 적용이 되질 않았다.
좀 더 관련 자료를 찾아보니 spring이 3.x.x 버전이 되면서 spring security도 6버전을 사용한다고 한다.
그래서 위와같이 springsecurity6로 변경했더니 해결되었다.
참고 : https://hyunsb.tistory.com/m/entry/Spring-Security-authorize%EA%B0%80-%EC%9D%B8%EC%8B%9D-%EC%95%88%EB%90%98%EB%8A%94-%EC%83%81%ED%99%A9

 

[Spring Security] authorize가 인식 안되는 상황

sec:authorize는 스프링 시큐리티에서 제공하는 기능이므로, 스프링 시큐리티 의존성을 추가하셔야 합니다. 또한 isAuthenticated() 메서드를 사용하기 위해서는 스프링 시큐리티 설정 파일에서 로그인

hyunsb.tistory.com

 

 

3. UserDetails 구현 유무
spring security를 통해 로그인, 회원가입을 구현하기 위해 UserDetailsService를 implements하고
loadUserByUsername등의 함수를 구현하여 UserDetails 객체를 리턴해주지 않으면 적용이 되지 않는다는 것이다.

참고 : https://velog.io/@sin_0/%EC%98%A4%EB%A5%98-isAnonymous%EC%99%80-isAuthenticated%EA%B0%80-%EC%9E%98-%EB%8F%99%EC%9E%91%ED%95%98%EC%A7%80-%EC%95%8A%EC%9D%8C

 

[오류/해결][Spring] isAnonymous()와 isAuthenticated()가 잘 동작하지 않음

내일 꼭 찾는다(23/04/18 해결)

velog.io

 

위의 원인들과 같이 html 혹은 thymeleaf 부분에서 문법 오류 혹은 의존성 문제, UserDetails 구현등의
여러가지 복합적인 문제로 적용이 되지 않을 수도 있다.
이외에도 웹 사이트 쿠키가 쌓여 변경된 html/css가 적용되지 않아 보이지 않는 경우도 있으니 웹에서 개발자 도구를 통해 개발 환경에서의 html/css 코드와 웹 상에 로드된 html/css 버전을 확인하는 과정도 필요하다.