ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Security] 스프링 시큐리티 설정
    DEV/Spring 2020. 7. 15. 15:57

    *스프링시큐리티설정 전 프로젝트 기본셋팅*

    더보기

    1. 프로젝트 만들기

    프로젝트생성 - Maven project - Archetype은 webapp으로 선택

    GroupId, Artifact Id는 마음대로

     

    2. 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>
        <groupId>org.edwith.webbe</groupId>
        <artifactId>securityexam</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>war</packaging>
    
        
        <properties>
        <!-- eclipse에서 웹 어플리케이션 프로젝트 작성시 web.xml파일을 작성하지 않고 java-config로 설정할 경우 아래의 설정이 있어야 합니다.-->
            <failOnMissingWebXml>false</failOnMissingWebXml>
            <!-- spring 5.2.3이 나오는 시점에 spring security는 5.2.2가 최신버전이라서 5.2.2.RELEASE로 설정함 -->
            <spring.version>5.2.2.RELEASE</spring.version>
        </properties>
    
        <dependencies>
            <!-- servlet-api이다. tomcat에 배포될 경우엔 사용되지 않도록 하기 위해서 scope를 provided로 설정하였다. -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
                <scope>provided</scope>
            </dependency>
    
            <!-- jsp-api이다. tomcat에 배포될 경우엔 사용되지 않도록 하기 위해서 scope를 provided로 설정하였다. -->
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>javax.servlet.jsp-api</artifactId>
                <version>2.3.2-b02</version>
                <scope>provided</scope>
            </dependency>
    
            <!-- jstl은 tomcat이 기본 지원하지 않는다. 그렇기 때문에 tomcat에도 배포가 되야 한다.-->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
    
            <!-- spring webmvc에 대한 의존성을 추가한다. spring webmvc에 대한 의존성을 추가하게 되면 spring-web, spring-core등이 자동으로 의존성이 추가된다.-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <!-- java 9 이상에서 추가해줘야 합니다. @PostConstruct 등을 사용하려면 필요함-->
            <dependency>
                <groupId>javax.annotation</groupId>
                <artifactId>javax.annotation-api</artifactId>
                <version>1.3.2</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${spring.version}</version>
            </dependency>
            
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.7.0</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>utf-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>

     

    3. Maven update

     

    4. 웹 어플리케이션 설정파일 작성

    package securityexam.config;
    
    import org.springframework.web.filter.CharacterEncodingFilter;
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
    
    import javax.servlet.*;
    
    //web.xml파일을 대신하는 자바 Config설정파일
    public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
    	//Spring Config 파일 설정
    	@Override
    	protected Class<?>[] getRootConfigClasses(){
    		return new Class<?>[] {ApplicationConfig.class, SecurityConfig.class};
    	}
    	
    	//Spring web config 파일 설정
    	//WebConfig는 Bean을 RootConfig에서 설정한 곳에서부터 찾는다.
    	@Override
    	protected Class<?>[] getServletConfigClasses(){
    		return new Class<?>[] {MvcConfig.class};
    	}
    	
    	/*
        getServletMapping()은 DispatcherServlet이 매핑되기 위한 하나 혹은 여러 개의 패스를 지정한다.
       	이 코드에서는 애플리케이션 기본 서블릿인 /에만 매핑이 되어 있다. 그리고 이것은 애플리케이션으로 들어오는 모든 요청을 처리한다.
       	원래 서블릿에서는 / 을 처리하는 DefaultServlet이 설정되어 있다.
         */
    	@Override
    	protected String[] getServletMappings() {
    		return new String[]{"/"};
    	}
    	
    	//필터 설정
    	//DispatcherServlet 앞에 동작
    	@Override
    	protected Filter[] getServletFilters() {
    		CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
    		encodingFilter.setEncoding("UTF-8");
    		
    		return new Filter[] {encodingFilter};
    	}
    }
    

    WebAppWebAppInitializer.java

     

    //Spring 설정파일
    //레이어드 아키텍처에서 Controller가 사용하는 Bean들에 대해 설정을 한다.
    //dao, service를 컴포넌트 스캔하여 찾도록 한다.
    //어노테이션으로 트랜잭션을 관리하기 위해 @EnableTransactionManagement를 설정하였다.
    @Configuration
    @EnableTransactionManagement
    @ComponentScan(basePackages= {"securityexam.dao","securityexam.service"})
    public class ApplicationConfig{
    
    }

    ApplicationConfig.java

     

    //Spring MVC설정파일
    //@EnableWebMvc는 어노테이션 기반의 스프링 MVC를 구성할 때 필요한 Bean들을 자동으로 구성해주는 역할을 수행
    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages= {"securityexam.controller"})
    public class MvcConfig implements WebMvcConfigurer{
    	// default servlet 핸들러를 설정한다.
    	// 원래 서블릿은 / (모든 요청)을 처리하는 default servlet을 제공한다.
    	// 스프링에서 설정한 path는 스프링이 처리하고, 스프링이 처리하지 못한 경로에 대한 처리는 디폴트 서블릿에게 전달하여 처리하게 된다.
    	@Override
    	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    		configurer.enable();
    	}
    	
    	//Spring MVC에서 jsp view가 위치하는 경로를 설정
    	@Override
    	public void configureViewResolvers(ViewResolverRegistry registry) {
    		registry.jsp("/WEB-INF/views/", ".jsp");
    	}
    	
    	// '/'로 요청이 오면 '/main'으로 리다이렉트
    	@Override
    	public void addViewControllers(ViewControllerRegistry registry) {
    		registry.addRedirectViewController("/", "/main");
    	}
    	
    	 //  /resources 경로에 있는 자료들을 /resources/**로 접근하게 하기
    	@Override
    	public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    		registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    	}
    }
    

    MvcConfig.java


    1. pom.xml에 의존성 추가

    	<!-- Spring Security Core -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-core</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <!-- Spring Security Config -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-config</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <!-- Spring Security Web -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <!-- Spring Security JSP Custom Tags -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-taglibs</artifactId>
                <version>${spring.version}</version>
            </dependency>

     

    2. Spring Security 설정파일 작성

    import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
    
    //AbstractSecurityWebApplicationInitializer를 상속받는 클래스를 작성해야 스프링 시큐리티 필터들이 활성화된다.
    public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
    
    }

    SecurityWebApplicationInitializer.java

     

     

     

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.builders.WebSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;
    
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    	
    	//   /webjars/** 경로에 대한 요청은 인증/인가 처리하지 않도록 무시 (** = 모든경로)
    	//아래 메소드는 인증/인가가 필요 없는 경로를 설정할 필요가 있을 때 오버라이딩
    	@Override
    	public void configure(WebSecurity web) throws Exception {
    		web.ignoring().antMatchers("/webjars/**");
    	}
    	
    	//아래 메소드는 인증/인가에 대한 설정
    	//  /, /main에 대한 요청은 누구나 할 수 있지만, 
    	//  그 외의 요청은 모두 인증 후 접근 가능
    	@Override
    	protected void configure(HttpSecurity http) throws Exception {
    		http
    			.csrf().disable()
    			.authorizeRequests()
    			.antMatchers("/", "/main").permitAll()
    			.anyRequest().authenticated();
    	}
    	
    	//패스워드 인코더를 빈으로 등록.
    	//암호를 인코딩하거나 인코딩된 암호와 사용자가 입력한 암호가 같은지 확인할때 사용
    	@Bean
    	public PasswordEncoder encoder() {
    		return new BCryptPasswordEncoder();
    	}
    }
    

    SecurityConfig.java

    스프링 시큐리티를 이용해 로그인/로그아웃/인증/인가 등을 처리하기 위한 설정 파일

    • @EnableWebSecurity가 붙어 있을 경우 스프링 시큐리티를 구성하는 기본적인 빈(Bean)들을 자동으로 구성해준다.
    • WebSecurityConfigurerAdapter를 상속받으면, 특정 메소드를 오버라이딩 함으로써 좀 더 손쉽게 설정할 수 있다.

     

    3. 보안 설정 테스트 컨트롤러 작성

    @Controller
    public class MainController {
    	@RequestMapping("/main")
    	@ResponseBody
    	public String main() {
    		return "main page";
    	}
    	
    	@RequestMapping("/securepage")
    	@ResponseBody
    	public String securitypage() {
    		return "secure page";
    	}
    }

     

    http://localhost:8080/securityexam/main 실행모습

    http://localhost:8080/securityexam/securepage 요청시

    = 인증을 거쳐야 접근이 가능함

    댓글

Designed by Tistory.