본문 바로가기
Spring

spring-security-taglibs 을 사용해 로그인 인증 확인, 세션 정보 활용하기 [스프링 시큐리티]

by 쌩욱 2021. 8. 18.

어플리케이션을 구현하다보면 jsp에서 분기처리를 해서 권한에 따라서 다른 상황이 발생합니다.
이런 상황일때 스프링 시큐리티를 사용하여 권한관리를 하고 있다면 간단하게 구현을 할 수 있습니다. 

 

ex)

- 관리자 권한이 있다면 관리자 페이지 링크를 보여주는 로직

- 로그인에 성공해서 특정 권한을 획득한 사용자에게는 로그인 버튼 대신 로그아웃 버튼을 보여주는 로직

 

권한 정보는 세션에 저장돼 있기 때문에 가져다가 사용해도 무방하지만, Security 태그를 사용하면 좀 더 가시성 좋게 코드를 구성할 수 있습니다.

 

1. pom.xml에 dependency 추가

<!-- 시큐리티 태그 라이브러리 -->
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-taglibs</artifactId>
</dependency>

 

2. JSP 파일에 태그 라이브러리 추가

현재 프로젝트에서는 헤더 JSP 파일을 만들어 모든 JSP파일에 삽입하여 로그인에 성공한 사용자의 세션에 접근할 것 입니다.

isAuthenticated() 함수는 로그인 인증을 받았는지를 확인합니다. ( <-> isAnonymous()  )

<!-- header.jsp -->

...

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>

<!-- 세션정보 접근 -->
<!-- 이제 어디에서든지 principal.~ 로 접근가능 -->
<sec:authorize access="isAuthenticated()">
	<sec:authentication property="principal" var="principal"/>
    <!-- principal property가 UserDetails임-->
</sec:authorize>

...

 

그리고 다른 jsp 파일들에선 이런식으로 헤더파일의 경로를 include 해주시면 됩니다.

<%@ include file="../layout/header.jsp"%>

 

property를 principal로 주고 변수에 담아주면 자바 코드에서 getProperty()를 실행한것과 동일합니다.

즉 사용자 정보를 담고 있는 UserDetails 객체가 반환됩니다.

변수명을 principal로 설정했기 때문에

저희는 모든 jsp 파일에서 principal 변수로 세션 정보에 접근할 수 있습니다.

 

3. 세션 정보 사용

 ...
 
	<div class="item__title">이름</div>
		<div class="item__input">
			<input type="text" name="name" placeholder="이름"
				value="${principal.user.name}" required="required"/>
		</div>
	</div>
    
 ...

이전 글에서 저희는 UserDetails를 구현한 PrincipalDetails에 User 객체를 user 변수에 넣었기 때문에 

${principal.user.name} 으로 JSP파일에서 해당 유저의 이름에 접근할 수 있습니다.