본문 바로가기
Spring/Spring Security

[Spring Security] 4. 로그아웃(logout) 구현하기

로그인이 있으면 당연히 로그아웃이 있는게 당연하다. 스프링시큐리티를 사용하지 않고 로그인 기능을 구현하게 되면 별도로 로그아웃 url을 통해 세션관리를 해주었는데 이러한 과정을 스프링시큐리티에서는 어떤식으로 구현하고 또 어떤 기능들이 있는지 살펴보는 내용을 알아보도록 하겠다.

 

 

 

 

 

xml 설정

<http auto-config="true" use-expressions="true">
  <intercept-url pattern="/user/**" access="hasAnyRole('ROLE_USER','ROLE_GUEST')"/>
  <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/>
  <intercept-url pattern="/**" access="permitAll"/>

  <form-login
  username-parameter="id"
  password-parameter="pw"
  login-processing-url="/login"
  login-page="/loginPage"
  default-target-url="/all" />

  <logout
  logout-url="/logout"
  logout-success-url="/all"
  delete-cookies=""/>
</http>

자세한 설명은 생략한다...

 

 

 logout-url : 로그아웃 URL

 logout-success-url : 로그아웃 성공시, 이동할 URL. (default: /login?logout)

 invalidate-session : 로그아웃 시, session을 무효화할 지 선택. (default: true)

 delete-cookies : 로그아웃 성공시, 삭제할 쿠키 이름 지정

 success-handler-ref : 로그아웃 성공시, logout-success-url 이 아닌 핸들러로 리다이렉트

 

 

 

 

 

로그아웃 버튼 만들기

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>ADMIN 접근 가능페이지</h1>


<sec:authorize access="isAuthenticated()">
  <a href="#" onclick="document.getElementById('logout').submit();">로그아웃</a>
</sec:authorize>


<form id="logout" action="/logout" method="POST">
   <input name="${_csrf.parameterName}" type="hidden" value="${_csrf.token}"/>
</form>

</body>
</html>

로그아웃 버튼인데 sec태그를 사용하여 로그인한 사용자에게만 로그아웃 버튼이 보이도록 했다.

 

 

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

참고로 sec태그를 사용하기 위해서는 jsp파일에 선언을 해주어야 한다.

 

 

<input name="${_csrf.parameterName}" type="hidden" value="${_csrf.token}"/>

스프링시큐리티는 보안을 위하여 모든 요청에 대한 토큰을 확인한다.

 

 

<security:csrf disabled="false"/>

스프링시큐리티 설정 xml파일에서 이부분이 토큰을 사용하겠다는 의미이다. false가 사용하겠다는 의미이니 이부분을 조심해야 하며
디폴트값이 false이기 때문에 별도로 설정을 하지 않느다면 자동으로 토큰처리가 된다.

 

 

<sec:authorize access="isAuthenticated()">
  <a href="#" onclick="document.getElementById('logout').submit();">로그아웃</a>
</sec:authorize>


<form id="logout" action="/logout" method="POST">
   <input name="${_csrf.parameterName}" type="hidden" value="${_csrf.token}"/>
</form>

로그인도 처럼 로그아웃도 마찬가지로 요청은 POST로 해야 한다.
하지만 화면단의 상황에 따라 a태그를 사용할 수밖에 없는 상황이라면 임기응변으로 위의 코드처럼 처리가 가능하다.

댓글