Spring

Spring Security - Configuration

728x90

참조한 강의 : Spring & Hibernate For Beginners (www.udemy.com/course/spring-hibernate-tutorial/)

 

 

 

이전 포스팅에서 간단하게 Spring Security 가 무엇인지 알아봤으니, 이번에는 Spring Security 를 프로젝트에 설정하는 방법에 대해서 알아본다.

 

이전 포스팅들에서 다뤘던 다른 스프링 프로젝트들과 마찬가지로, Spring Security 도 xml 파일로 설정하는 방법 혹은 xml 파일없이 어노테이션을 이용한 순수 자바 파일로만 설정하는 방법 2가지가 있다.

 

여기서는 어노테이션을 이용한 순수 자바 파일로 설정하는 방법만을 다루겠다.

 

xml 파일로 설정하는 방법은 아래 사이트 참조

 

- xml 로 spring security 설정하기 : sjh836.tistory.com/165

 

spring security 파헤치기 (구조, 인증과정, 설정, 핸들러 및 암호화 예제, @Secured, @AuthenticationPrincipal,

참조문서 https://docs.spring.io/spring-security/site/docs/4.2.7.RELEASE/reference/htmlsingle/#getting-started http://springsource.tistory.com/80 https://okky.kr/article/382738 1. 스프링 시큐리티란?..

sjh836.tistory.com

 

 

- Only Java

: 먼저 이 포스팅에서 다룰 예제는 빌드 툴로 Maven 을 사용했고, Spring MVC 와 Spring Security 를 사용했음을 밝힌다.

 

 

먼저 메이븐 기반의 프로젝트를 생성하고

pom.xml 에 예제 프로젝트에 넣어줄 Spring MVC 와 Spring Security 프로젝트에 대한 의존성 주입을 해준다

 

- pom.xml 

<?xml version="1.0" encoding="UTF-8"?>
 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
 
  <!-- 프로젝트 이름 버전 등 메타데이터 정보 생략 ... -->    
 
  <properties>
      <springframework.version>5.2.13.RELEASE</springframework.version>
      <springsecurity.version>5.4.5</springsecurity.version>
      
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
 
  <dependencies>
 
        <!-- Spring MVC support -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        
        <!-- Spring Security Web -->
        <dependency>
          <groupId>org.springframework.security</groupId>
          <artifactId>spring-security-web</artifactId>
          <version>${springsecurity.version}</version>
        </dependency>
        
        <!-- Spring Security Config -->
        <dependency>
          <groupId>org.springframework.security</groupId>
          <artifactId>spring-security-config</artifactId>
          <version>${springsecurity.version}</version>
        </dependency>
        
        <!-- Spring Security JSP Tag library -->
        <dependency>
          <groupId>org.springframework.security</groupId>
          <artifactId>spring-security-taglibs</artifactId>
          <version>${springsecurity.version}</version>
        </dependency>
        
        <!-- Servlet, JSP and JSTL support -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
 
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
 
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
 
        <!-- 다른 Dependency 생략.... -->                
  </dependencies>
    
  <!-- build 부분 생략... -->
</project>
cs

 

Spring Security, Spring MVC, JSP, JSTL 등 을 의존성 주입해줬다.

 

 

* 하나 주의할점은 다른 Spring 프로젝트 (AOP, MVC, Core 등등) 와 Spring Security 는 버전이 동시에 관리되지 않는다.

무슨말이냐면, 기본적인 Spring 프로젝트가 Release 되는 시간이나 Support 되는 기간 같은것들이 Spring Security 와 다르게 나타난다는 의미이다. Spring Security 가 먼저 신 버전이 나올 수도 있고, 다른 일반적인 스프링 프로젝트가 먼저 신 버전이 나올 수도 있다. 

둘의 버전이 동기화되어서 관리되는게 아니기 때문에, 항상 의존성 주입할때 버전이 맞게 들어가도록 주의해야한다.

 

 

 

그리고 오로지 자바 파일로만 프로젝트 셋팅을 할 것이므로, 

어노테이션을 이용한 자바 설정 파일을 만든다

 

- DemoAppConfig.java

@Configuration
@EnableWebMvc
@ComponentScan("com.test.maven")
public class DemoAppConfig {
    
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
        
        internalResourceViewResolver.setPrefix("/WEB-INF/view/");
        internalResourceViewResolver.setSuffix(".jsp");
        
        return internalResourceViewResolver;
    }
}
cs

 

@Configuration 은 이 자바파일이 설정 파일임을 나타내고

@EnableWebMvc 는 xml 으로 프로젝트 설정시에 <mvc:annotation-driven /> 과 같은 의미를 지니는데, 그냥 Spring MVC 를 사용하겠다는 의미와 같다.

@ComponentScan 은 스프링 컨테이너가 Spring Bean 을 탐색하기 위한 패키지 이름을 의미한다.

 

 

그리고 ViewResolver 는 MVC 중에서 V 에 대한 설정을 어떻게 할지를 정의하는 부분이며

Spring MVC 를 접해봤다면 하나하나 다 설명하지 않더라도 코드를 보고 대략 짐작이 될 것이다.

setPrefix 는 View 파일이 위치한 부분

setSuffix 는 View 파일의 확장자명 .. 

 

 

다음으로 이 프로젝트에서 mvc 를 사용할것이기 때문에 DispatcherServlet 에 대한 설정도 필요하다

(이에 대한 자세한 설명은 아래 참조)

sdy-study.tistory.com/186

 

Spring Framework - Spring MVC Overview

(본 포스팅 내용은 유데미의 Spring & Hibernate For Beginners (www.udemy.com/course/spring-hibernate-tutorial/) 강좌의 내용을 기반으로 공부한 것들을 요약한 포스팅이다) 이 포스팅에서는 MVC 가 무엇인지,..

sdy-study.tistory.com

 

 

- SpringMvcDispatcherServletInitializer.java 

public class SpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
 
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }
 
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { DemoAppConfig.class };
    }
 
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
 
}
cs

 

DispatcherServlet 을 프로젝트 내에서 초기화 시키고 Spring MVC 가 프로젝트 내에서 MVC 관련 코드가 쓰였음을 인지하기 위해서는 AbstractAnnotationConfigDispatcherServletInitializer 라는 아주 긴 이름의 클래스를 상속 받아서 위에 보이는 세개의 메소드를 오버라이드 해야한다.

 

 

다음으로는, Spring Security 를 웹 에서 사용하기 위해서는 앞선 포스팅에서도 언급했듯이 Spring Security Filter 를 사용할 수 있게 스프링 프로젝트에 등록해줘야한다.

따라서 이를 가능하게 해줄, AbstractSecurityWebApplicationInitializer 라는 클래스를 상속 받게 해야한다.

이 작업은 크게 뭐 설정할거 없이 그냥 상속만 받게 하면 된다

 

- SecurityWebApplicationInitiailzer.java

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
 
public class SecurityWebApplicationInitiailzer extends AbstractSecurityWebApplicationInitializer {
 
}
cs

 

 

다음으로 Spring Security 설정 파일을 만들어야 한다.

 

- DemoSecurityConfig.java

@Configuration
@EnableWebSecurity
public class DemoSecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        UserBuilder users = User.withDefaultPasswordEncoder();
        
        auth.inMemoryAuthentication()
            .withUser(users.username("tom").password("test123").roles("EMPLOYEE"))
            .withUser(users.username("mary").password("test123").roles("MANAGER"))
            .withUser(users.username("jerry").password("test123").roles("ADMIN"));
    }
    
}
cs

 

이 설정 파일은 위 처럼, WebSecurityConfigureAdapter 라는 클래스를 상속받아서 써야 하고

configure(AuthenticationManagerBuilder auth) 라는 메소드를 오버라이드 했다.

 

여기서는 단순히 테스트용으로 만든 프로젝트 여서, 실제 개발에서는 쓰지 않을 

in-memory 방식으로 유저의 이름과 비밀번호, role 을 저장하는 방식을 사용했다.

 

DB 와 연동하는 방법은 나중에 Spring MVC, Hibernate ORM, Spring Security 세개를 연동해서 로그인과 회원가입 모두를 작성하는 예제를 다루는 포스팅을 작성할때 서술하겠다.

 

그리고 기본적인 컨트롤러와 뷰 페이지를 만든다

 

- DemoController.java

@Controller
public class DemoController {
    
    @GetMapping("/")
    public String showHome() {
        return "index";
    }
}
cs

 

 

- index.jsp

<!DOCTYPE html>
<html>
    <head>    
        <title>Home Page</title>
    </head>
 
    <body>
        <h2>Hello World!</h2>
    </body>
</html>
cs

 

 

이렇게 설정해놓고 프로젝트를 실행시키면

기본적으로 제공하는 로그인화면이 다음과 같이 뜨게 된다.

 

 

 

다음은 로그인화면을 bootstrap 으로 꾸미는 방법과 로그아웃을 처리하는 방법에 대해 알아본다.

728x90

'Spring' 카테고리의 다른 글

Spring Security - CSRF (Cross Site Request Forgery)  (0) 2021.03.06
Spring Security - Custom Login Form  (0) 2021.03.05
Spring Security - Overview  (0) 2021.03.04
Maven 이란  (0) 2021.02.25
Spring Framework - AOP 코드 예제  (0) 2021.02.24