CSRF란 Cross Site Request Forgery로 보안 이슈이기때문에 꼭 해결해야한다.
스프링부트로는 CORS 설정을 한 적이 있는데 이번 프로젝트는 전자정부프레임워크를 사용해야해서 조금 새로웠다. 전자정부프레임워크 공식문서(링크) 에 spring security CSRF 간편설정이 있지만 왜인지 설정이 잘 되지않아 그냥 spring security를 pom.xml에 추가했다.
pom.xml 에 의존성 추가 프로젝트에 spring security를 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <properties > <spring.maven.artifact.version > 4.3.16.RELEASE</spring.maven.artifact.version > <egovframework.rte.version > 3.8.0</egovframework.rte.version > <security.version > 4.2.13.RELEASE</security.version > </properties > (중략) <dependency > <groupId > org.springframework.security</groupId > <artifactId > spring-security-core</artifactId > <version > ${security.version}</version > </dependency > <dependency > <groupId > org.springframework.security</groupId > <artifactId > spring-security-web</artifactId > <version > ${security.version}</version > </dependency > <dependency > <groupId > org.springframework.security</groupId > <artifactId > spring-security-config</artifactId > <version > ${security.version}</version > </dependency > <dependency > <groupId > org.springframework.security</groupId > <artifactId > spring-security-taglibs</artifactId > <version > ${security.version}</version > </dependency > (생략)
web.xml 추가 아래 필터를 추가한다.
1 2 3 4 5 6 7 8 9 <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 >
context-security.xml 생성 context 설정에 따라 이름에 맞는 시큐리티 config xml파일을 생성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ="http://www.springframework.org/schema/beans" xmlns:sec ="http://www.springframework.org/schema/security" 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 http://www.springframework.org/schema/security/spring-security.xsd" > <sec:authentication-manager alias ="authenticationManager" /> <sec:http pattern ="/admin/**" security ="none" /> <sec:http pattern ="/css/**" security ="none" /> <sec:http pattern ="/img/**" security ="none" /> <sec:http pattern ="/js/**" security ="none" /> <sec:http pattern ="/uploads/**" security ="none" /> <sec:http pattern ="/file/**" security ="none" /> <sec:http use-expressions ="true" > <sec:form-login /> <sec:csrf disabled ="false" /> </sec:http > </beans >
form-login 로그인 페이지를 연결하면 CSRF를 방어할 수 있다. 커스텀한 로그인 로직을 사용하기때문에 <sec:form-login />
해당 부분을 빼고 싶었는데 해당 코드를 빼면 서버 에러가 나서 입력만 하고 연결하지 않았다. 참고로 disabled=”false”가 CSRF를 사용하겠다는 의미이다.
토큰을 jsp화면에 넣기 form태그 아래에 넣어주면 된다!