Spring Security 설정
- 스프링 시큐리티는, 서브릿의 필터와 인터셉터를 이용하여 처리
- 필터 : 스프링과 무관한 서블릿 자원
- 인터셉터 : 스프링의 빈으로 관리되는 스프링 컨텍스트에 속함, 스프링 내부 컨트롤러 호출 마다 관여
1. pom.xml 의존성 추가하기
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.4.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.4.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.4.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>5.4.2</version>
</dependency>
2. security-context.xml 파일 추가
- /WEB-INF/spring 하위에
security-context.xml
추가 - file > new > ‘Spring Bean Configuration File' 로 생성
- security-context.xml 의 네임스페이스 추가
- 네임스페이스에 5버전이 명시되어 있다면 버전부분만 삭제하고 사용할 것. (spring-security-5.0.xsd => spring-security.xsd)
- 스프링 시큐리티를 사용하기 위한 최소한의 설정 추가
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<security:http>
<security:form-login/>
</security:http>
<security:authentication-manager>
</security:authentication-manager>
</beans>
3. web.xml에 security-context 로딩 설정
- 시큐리티 필터 빈을 재대로 이용하기 위해 스프링 설정 파일을 로딩하도록 설정
- 필터를 이용해서 시큐리티가 스프링 동작에 관여하도록 설정
<!-- 시큐리티 관련 설정파일 추가 -->
<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>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 시큐리티 필터 추가 -->
<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>
4. 기본설정 상태에서 웹서버 확인
- SecuritySampleController.java 에 URL 설계
package org.example.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import lombok.extern.log4j.Log4j; @Controller @RequestMapping("/sample/*") @Log4j public class SecuritySampleController { @GetMapping("/all") public void doAll() { log.info("do all access everybody."); } @GetMapping("/member") public void doMember() { log.info("logined member."); } @GetMapping("/admin") public void doAdmin() { log.info("admin only."); } }
- view/sample 하위에 URL에 맞는 jsp 작성
- all.jsp, member.jsp, admin.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'> <title>Insert title here</title> </head> <body> <h1>/sample/all page</h1> </body> </html>
- 탐캣을 실행 시킨 후, 웹브라우저에서 화면이 잘 뜨는지 확인
- http://localhost:8080/sample/all
- http://localhost:8080/sample/all
5. 인증과 권한부여
-
Authentication (인증)
- 자신을 증명하는 것, 회원가입 후 로그인 절차 같이 자신이 ID 아무개 임을 PASSWORD로 증명하는 것
-
Authorisation (권한부여)
- 페이지 별로, 접근이 허용되는 권한이 다른데, 그 권한이 부여된 것.
-
인증과 권한부여를 담당하는 클래스
- AuthenticationManager <- ProviderManager <-> AuthenticationProvider <-> UserDetailsService
- 개발자가 시큐리티 커스터마이징 하는 방법
- 새로운 프로토콜, 인증 구현 방식 직접 구현하는 경우 : AuthenticationProvider를 직접 구현하는 방식
- UserDetailsService 구현하는 방식