티스토리 뷰

Chapter08. 스프링 시큐리티 : 로그인/로그아웃 페이지 만들기

 

 

 

 

8.1 스프링 시큐리티 개요

 

 

8.1.1 스프링 시큐리티

스프링 시큐리티는 스프링 기반 애플리케이션의 보안(인증과 권한)을 담당하는 프레임워크이다.

스프링 시큐리티를 이용하면 웹 애플리케이션에 로그인할 때 아이디와 비밀번호를 입력해 사용자를 인증(authentication)하고 로그인한 후 접근 가능한 경로를 제한할 수 있는 권한부여(authorization) 작업 등을 효율적으로 구현할 수 있다.

 

 

 

스프링 시큐리티 이용시 환경 설정 순서

 

step1. pom.xml 파일에 의존 라이브러리 등록하기

스프링 MVC에서 스프링 시큐리티를 사용하려면 pom.xml 파일에 spring-security-seb.jar을 spring-security-config.jar과 의존 라이브러리로 등록해야 한다.

        <dependency>
             <groupId>org.springframework.security</groupId>
             <artifactId>spring-security-web</artifactId>
             <version>5.6.3</version>
        </dependency>
        <dependency>
             <groupId>org.springframework.security</groupId>
             <artifactId>spring-security-config</artifactId>
             <version>5.6.3</version>
        </dependency>

 

  • spring-security-web.jar : 필터 및 웹 보안 인프라 관련 코드를 포함한다. 서블릿 API 종속성이 있는 모든 것, 스프링 시큐릴티 웹 인증 서비스 및 URL 기반 액세스를 제어하는 경우 필요한 모듈이다. 
  • spring-security-config.jar : 보안 네임 스페이스 구문을 분석하는 코드를 포함한다. 구성을 위해 스프링 시큐리티 XML 네임 스페이스를 사용하는 경우에 필요한 모듈이다. 

 

 

 

 

step2. web.xml 파일에 시큐리티 필터 등록하기

스프링 MVC에서 서블릿 필터로 스프링 시큐리티를 동작해 모든 웹 요청에 대해 권한을 확인하도록 하려면 스프링 시큐리티 필터를 등록해야 한다.

web.xml 파일에 아래와 같이 서블릿 필터 DelegatingFilterProxy를 등록해야한다.

   <filter>
      <filter-name>springSecurityFilterChain</filter-name> 
      <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
   </filter>
   <filter-mapping>
      <filter-name>springSecurityFilterChain</filter-name> 
      <url-pattern>/*</url-pattern> 
   </filter-mapping>

 

 

 

 

step3. web.xml 파일에 스프링 시큐리티 설정 파일 등록하기

시큐리티 설정 파일은 스프링 시큐리티에 사용되는 빈을 위한 파일로, web.xml 파일의 <context-param> 요소에 시큐리티 설정 파일을 등록하여 읽게 한다.

이때 시큐리티 설정 파일의 이름은 security-context.xml이다. 

   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/spring/root-context.xml
            /WEB-INF/spring/security-context.xml
      </param-value>
   </context-param>

 

 

 

 

 

 

 

8.1.2 스프링 시큐리티 태그

시큐리티 태그는 접근 권한을 위한 태그와 사용자 권한을 위한 태그로 분류할 수 있다.

 

접근 권한 태그는 허가된 사용자만 특정 페이지에 접근하게 하고 인증을 처리하는 로그인 페이지를 호출하거나 로그아웃을 처리하도록 설정하는데 사용한다.

사용자 권한 태그는 인증을 처리하기 위해 사용자 정보를 가져오는데 사용한다.

 

주요 스프링 시큐리티 태그의 종류

태그 설명
<http> 시큐리티의 시작과 끝을 나타내는데 사용한다.
<intercept-url> 시큐리티가 감시해야 할 URL과 그 URL에 접근 가능한 권한을 정의하는데 사용한다.
<from-login> 로그인 관련 설정을 하는데 사용한다.
<logout> 로그아웃 관련 설정을 하는데 사용한다.
<authenticaftion-manager> 사용자 권한 서비스의 시작과 끝을 나타내는데 사용한다.
<authentication-provider> 사용자 정보를 인증 요청하는데 사용한다.
<user-service> 사용자 정보를 가져오는데 사용한다.
<user> 사용자 정보를 나타내는데 사용한다.

 

 

 

 

 

 


 

 

8.2 접근 권한과 사용자 권한 설정

 

 

 

 

 

8.2.1 접근 권한을 설정하는 시큐리티 태그

인증이 허가된 특정 사용자에 따라 특정 경로에 접근할 수 있게 설정하는 태그이다.

종류로는 <http>와 <intercept-url>이 있다.

 

 

 

<http> 태그

<http> 태그는 스프링 시큐리티 설정의 핵심으로 시작과 끝 태그 (<http> ... </http>) 안에 스프링 시큐리티와 관련된 내용을 포함하는 최상위 태그이다.

 

 

 

<http> 태그의 속성

속성 설명
auto-config 일반적인 웹 애플리케이션에 필요한 기본 보안 서비스를 자동으로 설정한다.
use-expressions <intercept-url> 태그의 access 속성에서 스프링 표현 언어(SpEL)를 사용할 수 있다.

 

 

 

<http auto-config='true' use-expressions="true">
	//생략
</http>

 

  • auto-config : 기본 로그인 페이지, HTTP 기본 인증, 로그아웃 기능 등 제공 여부를 알려준다.
  • use-expressions : 스프링 표현 언어의 사용 여부를 알려준다.

 

 

 

<intercept-url> 태그

<intercept-url> 태그는 접근 권한에 대한 URL 패턴을 설정할 때 사용된다. 

<http> 태그 안에 여러 개 설정할 수 있고 선언된 순서대로 접근 권한이 적용된다.

 

 

<intercept-url> 태그의 속성

속성 설명
pattern ant 경로 패턴(?(문자 한개와 매칭), *(0개 이상의 문자와 매칭), **(0개 이상의 디렉터리와 매칭))을 사용하여 접근 경로를 설정한다.
access pattern 속성에 설정된 경로 패턴에 접근할 수 있도록 사용자 권한을 설정한다.
requires-channel 정의된 패턴 URL로 접근하면 설정된 옵션 URL로 리다이렉션한다. 옵션으로 http, htttps, any 가 있다.

 

 

 

< intercept-url > 태그 사용 예시

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
             .....>
   
   
   <http auto-config="true" use-expressions="true">
       <intercept-url pattern="/admin/**"  access="hasAuthority('ROLE_ADMIN')" />
        <intercept-url pattern="/manager/**"  access="hasRole('ROLE_MANAGER')" />
        <intercept-url pattern="/member/**"  access="isAuthenticated()" />
        <intercept-url pattern="/**"  access="permitAll" /> 
    </http>

 

위의 코드를 해석하면 /admin/**경로는 ROLE_ADMIN 권한이 있는 사용자만 접근할 수 있다.

/manager/** 경로는 ROLE_MANAGER 권한이 있는 사용자만 접근할 수 있다.

/member/** 경로는 인증된 사용자만 접근(IsAuthenticated()) 할 수 있다.

/** 경로는 권한에 상관 없이 모두 접근할 수 있다.

 

* <intercept-url> 태그의 access 속성에 스프링 표현 언어를 사용하려면 <http> 태그 안에 use-expression를 true로 설정해야 한다.

 

 

 

스프링 표현(SpEL) 언어

속성 설명
hasRole([role]) - 현 권한자가 지정된 [role]을 가졌다면 true로 반환한다.
- [role]에서 'ROLE_' 접두어를 생략할 수 있다.
hasAnyRole([role1, role2]) - 현 권한자가 지정된 [role1, role2]에서 하나라도 가졌다면 true를 반환한다.
- 콤마로 구분하여 표현하고 'ROLE_' 접두어를 생략할 수 있다
hasAuthority([authority]) - 현 권한자가 지정된 [authority]를 가졌다면 true로 반환한다.
- [authority]에서 'ROLE_' 접두어를 생략할 수 있다.
hasAnyAuthority([authority1, authority2]) - 현 권한자가 지정된 [authority1, authority2]에서 하나라도 가졌다면 true를 반환한다.
- 콤마로 구분하여 표현하고 'ROLE_' 접두어를 생략할 수 있다.
principal 현 사용자를 나타내는 주요 객체에 직접 접근할 수 있도록 허락한다
authentication SecurityContext에서 얻은 현 인증 객체에 직접 접근할 수 있도록 허락한다.
permitAll 현 권한자에 상관없이 항상 true이다.
denyAll 현 권한자에 상관없이 항상 false이다.
isAnonymous() 현 권한자가 익명의 사용자이면 true를 반환한다.
isRememberMe() 현 권한자가 기억된 사용자이면 true를 반환한다.
isAuthenticated() 사용자가 익명이 아니면 true를 반환한다.
isFullyAuthenticated() 익명의 사용자이거나 기억된 사용자가 아니면 true를 반환한다.

 

 

[role] 과 [authority]의 기본 권한 표현

권한 설명
ROLE-ADMIN 관리자
ROLE-USER 일반 사용자
ROLE_ANONYMOUS 모든 사용자
ROLE_RESTRICTED 제한된 사용자
IS_AUTHENTICATED_FULLY 인증된 사용자
IS_AUTHENTICATED_ANONYMOUSLY 익명 사용자
IS_AUTHENTICATED_REMEMBERD REMEMBERED 사용자

 

 

 

 

 

8.2.2 사용자 권한을 설정하는 시큐리티 태그

사용자 권한 서비스 태그는 허가된 사용자의 아이디와 비밀번호 등 사용자 정보를 직접 설정하는데 사용되며 태그 유형은 아래와 같다.

 

 

사용자 권한 태그의 유형

종류 설명
<authentication-manager> 사용자 권한 인증을 위한 최상위 태그이다.
<authentication-provider> 사용자 정보를 인증 요청 처리할 경우 사용한다.
<user-service> 사용자 정보(사용자 ID, 사용자 암호, 권한 등)를 가져올 때 사용한다.
<user> name, password, authorities 속성으로 사용자 정보를 나타낼 때 사용한다.

 

 

사용예시

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans 
											....>
                                            
    <authentication-manager>
          <authentication-provider>
              <user-service>
                 <user name="admin"  password="{noop}1234" authorities="ROLE_ADMIN, ROLE_USER"/> 
                 <user name="manager"  password="{noop}1235" authorities="ROLE_MANAGER"/>
                    <user name="guest"  password="{noop}1236" authorities="ROLE_USER"/>    
               </user-service>
          </authentication-provider>
   </authentication-manager>

</beans:beans>

 

<user> 태그에서 사용자 이름이 admin이고 비밀번호가 1234인 사용자는 관리자 및 일반 사용자 권한인 ROLE_ADMIN과 ROLE_USER를 가진다. (사용자 권한 설정)

<user> 태그에서 사용자 이름이 manager이고 비밀번호가 1235인 사용자는 매니저 권한인 ROLE_MANAGER을 가진다.

<user> 태그에서 사용자 이름이 guest이고 비밀번호가 1236인 사용자는 일반 사용자 권한인 ROLE_USER 권한ㅇ르 사진다.

 

 

 

 

<user-service> 태그에 사용자 정보를 가져오는 방법

사용자 권한 태그 사용

 

 

  • <user> 태그로 사용자 정보 가져오기

<user> 태그 안에 사용자 이름, 비밀번호, 권한 정보를 직접 작성하여 가져온다.

    <authentication-manager>
          <authentication-provider>
              <user-service>
                 <user name="user1"  password="1234" authorities="ROLE_ADMIN, ROLE_USER"/> 
                 <user name="user2"  password="1235" authorities="ROLE_MANAGER"/>
               </user-service>
          </authentication-provider>
   </authentication-manager>

 

 

 

  • 메시지 리소스 파일(*>properties)로 사용자 정보 가져오기

메시지 리소스 파일에 사용자 이름, 비밀번호, 권한 정보 등을 작성한ㄷ. 그 다음 <user-service> 태그 안에 메시지 리소스 파일을 설정하여 사용자 정보를 가져온다.

 

<authentication-manager>
      <authentication-provider>
      <user-service proterties="WEB-INF/user/uers.properties"/>
      </authentication-provider>
</authentication-manager>

 

 

 

  • 데이터베이스에서 사용자 정보 가져오기

<authentication-provider> 태그 안에 <jdbc-user-service> 태그를 사용하여 데이터베이스에서 사용자 정보를 조회하여 가져온다.

<authentication-manager>
	<authentication-provider>
    <jdbc-user-service data-source-ref="dataSource"/>
    </authentication-provider>
</authentication-manager>

 

 

메시지 리소스 파일(*>properties) 작성 예

admin=admin123, ROLE_ADMIN, ROLE_USER
uer1=111, ROLE_USER
user2=222,ROLE_USER

 

 

 

 

 

security-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
                                 http://www.springframework.org/schema/beans/spring-beans.xsd
                                 http://www.springframework.org/schema/security
                                 https://www.springframework.org/schema/security/spring-security.xsd">
   
   
   <http auto-config="true" use-expressions="true">
       <intercept-url pattern="/admin/**"  access="hasAuthority('ROLE_ADMIN')" />
        <intercept-url pattern="/manager/**"  access="hasRole('ROLE_MANAGER')" />
        <intercept-url pattern="/member/**"  access="isAuthenticated()" />
        <intercept-url pattern="/**"  access="permitAll" /> 
    </http>
 
    <authentication-manager>
          <authentication-provider>
              <user-service>
                 <user name="admin"  password="{noop}1234" authorities="ROLE_ADMIN, ROLE_USER"/> 
                 <user name="manager"  password="{noop}1235" authorities="ROLE_MANAGER"/>
                    <user name="guest"  password="{noop}1236" authorities="ROLE_USER"/>    
               </user-service>
          </authentication-provider>
   </authentication-manager>

</beans:beans>

 

 

 

 

Example01Controller.java

package com.springmvc.chap08;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class Example01Controller {
	
	@GetMapping("/exam01")
	public String requestMethod(Model model) {
		return "webpage08_01";
	}
	
	@GetMapping("/admin/main")
	public String requestMethod2(Model model) {
		model.addAttribute("data", "/webpage01/adminPage.jsp");
		return "webpage01/adminPage";
	}
	
	@GetMapping("/manager/main")
	public String requestMethod3(Model model) {
		model.addAttribute("data", "/webpage01/managerPage.jsp");
		return "webpage01/managerPage";
	}
	
	@GetMapping("/member/main")
	public String requestMethod4(Model model) {
		model.addAttribute("data", "/webpage01/memberPage.jsp");
		return "webpage01/memberPage";
	}
	
	@GetMapping("/home/main")
	public String requestMethod5(Model model) {
		model.addAttribute("data", "/webpage01/homePage.jsp");
		return "webpage01/homePage";
	}
}

 

 

 

admin.jsp, managerPage.jsp , memberPage.jsp, homePage.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Security</title>
</head>
<body>
	<h3>접근 권한과 사용자 권한 설정 예</h3>
	<p>뷰 페이지는 ${data } 입니다.
	<p><a href="<c:url value='/exam01' />">[웹 요청 URL /exam01로 이동하기]</a>
</body>
</html>

 

 

 

 

webpage08_01.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Security</title>
</head>
<body>
	<h3>스프링 시큐리티 예제</h3>
	<ul>
		<li>웹 요청 URL : <a href="<c:url value='/home/main' />">/home/main</a></li>
		<li>웹 요청 URL : <a href="<c:url value='/member/main' />">/member/main</a></li>
		<li>웹 요청 URL : <a href="<c:url value='/manager/main' />">/manager/main</a></li>
		<li>웹 요청 URL : <a href="<c:url value='/admin/main' />">/admin/main</a></li>
	</ul>
</body>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


8.3 뷰 페이지에 사용하는 시큐리티 태그

 

스프링 시큐리티는 JSP 뷰 페이지에서 보안 정보에 접근하고 보안 제약 조건을 적용하는 태그 라이브러리를 지원한다.

이것을 사용하려면 JSP에 태그 라이브러리를 선언해야 한다.

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

 

또한, 스프링 시큐리티 태그를 사용하려면 pom.xml 파일에 spring-security-taglibs.jar을 의존 라이브 러리로 등록해야 한다.

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>5.6.3</version>
</dependency>

 

 

 

 

 

8.3.1 권한 태그 : <sec:authorize>

권한 태그는 태그 안의 내용을 평가할지 여부를 결정한다. <sec:authorize> 태그로 표현하여 사용한다.

 

 

< sec:authorize> 태그의 속성

속성 설명
access 접근 권한 설정을 위한 정규 표현싯ㄱ을 설정한다.
url 접근 권한이 설정된 사용자만 접근하도록 경로를 설정한다.
var 접근 권한이 설정된 사용자를 변수로 재정의하여 설정한다.

 

 

 

 

 

 

 

Example02Controller.java

package com.springmvc.chap08;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class Example02Controller {
	
	@GetMapping("/exam02")
	public String requestMethod(Model model) {
		return "webpage08_02";
	}
	
	@GetMapping("/manager/tag")
	public String requestMethod2(Model model) {
		return "webpage08_02";
	}
}

 

 

 

webpage08_02.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>  
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Security</title>
</head>
<body>
	<h2>스프링 시큐리티 태그 예</h2>
	<sec:authorize access="hasRole('ROLE_MANAGER')" var="isAdmin">
		<p><h3>매니저 권한 화면입니다.</h3>
	</sec:authorize>
	<c:choose>
		<c:when test="${isAdmin }">
			<p>ROLE_MANAGER 권한 로그인 중입니다.
			<p><a href="<c:url value='/exam-2' />">[웹 요청 URL /exam02로 이동하기]</a>
		</c:when>
		<c:otherwise>
			<p>로그인 중이 아닙니다.
			<p><a href="<c:url value='/manager/tag' />">[웹 요청 URL /manager/tag로 이동하기]</a>
		</c:otherwise>	
	</c:choose>	
</body>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8.3.2 인증 태그 : <sec:authentication>

인증 태그는 시큐리티 설정 파일에 저장된 현재 authentication 객체에 대한 접근을 허용한다.

이것을 < sec:authentication>로 표현하여 사용하며 jsp 뷰 페이지에서 property 속성을 사용하여 현재 authentication 객체에 직접 접근할 수 있다.

 

 

 

<sec:authentication> 태그의 속성

속성 설명
property 접근 권한이 설정된 현재 authentication 객체 이름이다.
scope 접근 권한이 설정된 영역이다.
var 접근 권한이 설정된 사용자를 변수로 재정의하여 설정한다.

 

 

 

 

 

인증 태그를 설정하는 예시

 

Example03Controller.java

package com.springmvc.chap08;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class Example03Controller {

   
   @GetMapping("/exam03")
   public String requestMethod(Model model)
   {
      return "webpage08_03";
   }
   
   @GetMapping("/admin/tag")
   public String requestMethod2(Model model)
   {
      return "webpage08_03";
   }
}

 

 

 

 

webpage08_03.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>  
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Security</title>
</head>
<body>
	<h2>스프링 시큐리티 태그 예</h2>
	<sec:authorize access="hasRole('ROLE_ADMIN')" var="isAdmin">
		<p><h3>관리자 권한 화면입니다.</h3>
	</sec:authorize>
	<c:choose>
		<c:when test="${isAdmin }">
			<p>로그인 중입니다.
			<p>비밀번호 : <sec:authentication property="principal.password"/>
			<sec:authentication property="authorities" var="roles" scope="page"/>
			<p>권한 : 
				<ul>
					<c:forEach var="role" items="${roles }" >
						<li>${role }</li>
					</c:forEach>
				</ul>
			<p>이름 : <sec:authentication property="principal.username"/>
			<p><a href="<c:url value='exam03' />">[웹 요청 URL /exam03로 이동하기]</a>	
		</c:when>
		<c:otherwise>
			<p>로그인이 아닙니다.
			<p><a href="<c:url value='/admin/tag' />">[웹 요청 URL /admin/tag로 이동하기]</a>
		</c:otherwise>	
	</c:choose>
</body>
</html>

 

 

 

 

 

 

 

위의 결과처럼 두개의 값이 나오는 이유는 authoritise가 두개 이기 때문에 두번 실행하여 두개의 결과가 나온다.

 

 

 


 

8.4 로그인과 로그아웃 처리

 

 

 

 

8.4.1 <form-login> 태그

<form-login> 태그는 인증되지 않은 사용자가 특정 경로에 접근하거나 사용자 인증이 필요할 때 로그인 페이지를 보여주는데 사용된다.

아래와 같은 속성들을 사용하여 로그인 페이지를 출력하고 로그인하는 사용자 정보를 전송한다.

 

 

<form-login> 태그의 속성

속성 설명
login-page 로그인 페이지 경로를 지정한다.
login-processing-url 로그인 요청 처리 경로를 지정한다. <form> 태그의 action 속성 값을 설정한다.
default-target-url 로그인에 성공함녀 이동할 기본 경로를 지정한다.
always-use-default-target true 값으로 설정하면 항상 default-target-url 속성의 설정된 경로로 시작한다.
authentication-failure-url 로그인에 실패하면 이동할 경로를 지정한다. 기본값은 /login?error 이다.
username-parameter 로그인할때 사용자 계정 이름에 대한 파라미터 이름을 설정한다.
password-parameter 로그인할때 사용자 비밀번호에 대한 파라미터 이름을 설정한다.

 

 

<form-login> 태그를 사용한 예

<http>
	<form-login	login-page="/login" 
			login-processing-url = "/login"
			default-target-url = "/admin"
			username-parameter = "username"
			password-parameter = "password"
			authentication-failure-url = "/user/loginform?error=true"
    	/>
    	<logout logout-url = "logout" logout-success-url = "/logout"/>
 </http>

 

login-page가 /login 이므로 사용자 인증을 위한 로그인 페이지를 호출한다. 이것은 action의 역할과 같다.

login-processing-url을 설정했으므로 설정된 경로로 로그인 요청을 처리한다.

그리고 admin으로 로그인에 성공하면 자동으로 이동한다.

로그인 페이지에서 입력된 사용자 계정 이름을 설정된 사용자 계정 이름 username으로 전달 받는다.

로그인 페이지에서 입력된 사용자 비밀번호를 설정된 비밀번호 password로 전달받는다.

설정된 경로 /user/loginform으로 로그인에 실패하면 자동으로 이동한다.

 

 

 

 

 

 

8.4.2 <logout> 태그

<logout> 태그는 로그아웃을 처리하는데 사용되고 다음 속성들로 로그아웃 페이지를 출력한다.

 

* 세션과 쿠키 삭제된다.

 

 

 

<logout> 태그의 속성

속성 설명
delete-cookies 로그아웃에 성공하라 떄 삭제할 쿠키 이름을 지정한다. 콤마로 구분한다.
invalidate-session 로그아웃할 떄 세션을 제거할지 지정한다. 기본값은 true이다.
logout-success-url 로그아웃에 성공할 때 이동할 경로를 지정한다. 기본값은 /login?logout이다.
logout-url 로그아웃 요청 처리 경로를 지정한다. <form> 태그의 action 속성의 지정 값을 설정한다.
success-handler-ref 로그아웃에 성공할 때 이동을 제어하려면 LogoutSuccessHandler를 지정한다.

 

 

 

 

 

security-context.xml

       	<form-login	login-page="/login" 
			login-processing-url = "/login"
			default-target-url = "/admin"
			username-parameter = "username"
			password-parameter = "password"
			authentication-failure-url = "/user/loginform?error=true"
    	/>
    	<logout logout-url = "logout" logout-success-url = "/logout"/>
    </http>

 

 

Example04Controller.java

package com.springmvc.chap08;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class Example04Controller {
	@GetMapping("/login")
	   public String requestMethod(Model model)
	   {
	      return "loginform";
	   }
	
	@GetMapping("/admin")
	   public String requestMethod2(Model model)
	   {
	      return "webpage08_04";
	   }
	
	@GetMapping("/logout")
	   public String requestMethod3(Model model)
	   {
	      return "loginform";
	   }
}

 

 

loginform.jsp

<%@ 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>로그인</title>
</head>
<body>
	<h1>로그인</h1>
	<form action="./login" method="post">
		<p>사용자명 <input type="text" name="username" placeholder="username">
		<p>비밀번호 <input type="password" name="password" placeholder="password">
		<p><button type="submit">로그인</button>
		<input type="hidden" name="${_csrf.parameterName }" value="${_csrf.token }" />
	</form>
</body>
</html>

 

webpage08_04.jsp

 

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>  
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>스프링 시큐리티 예</title>
</head>
<body>	
	<sec:authorize access="isAuthenticated()">
		<h5><sec:authentication property="principal.username"/>님, 반갑습니다.</h5>
		<form action="./logout" method="post">
		<button type="submit">LOGOUT</button>
			<input name="${_csrf.parameterName }" type="hidden" value="${_csrf.token }" />
		</form>
	</sec:authorize>
</body>
</html>

 

 

 

 

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday