-
[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 요청시
= 인증을 거쳐야 접근이 가능함
'DEV > Spring' 카테고리의 다른 글
전자정부프레임워크기반 게시판 만들기 (1) 시작 (1) 2020.12.28 [Spring Security] 회원가입하기 (0) 2020.08.20 [Spring Security] DB정보로 로그인/로그아웃하기 (2) (0) 2020.08.14 [Spring Security] DB정보로 로그인/로그아웃하기 (1) (0) 2020.08.13 [Spring Security] 스프링 시큐리티 개념 (0) 2020.07.15