minlog
article thumbnail

 

앞에서는 HttpSession 을사용해서 회원에대한 정보를 저장하여 회원로그인 기능을 사용했다.

하지만 보안에 취약하여 정보를 POST로 보낼때에도 외부에서 정보를 가져갈 수 있는 위험이 있다.

때문에 Security를 사용하여 암호화한 정보를 함께 비교할 수 있게 해준다.

 

Spring Security

스프링에서 제공해주는 보안 설정이 있다. Form 에서 post로 넘어오는 정보에 대해 무조건 검증의 절차를 실행하게된다.

token 값을 넘기게 되고 해당 값이 있을시 실행시켜준다. 만약 값이 없거나 처음과 다른 값이 들어온다면 오류 페이지를 보여준다.

 

Token  - CSRF(Cross-site request forgery) 

CSRF(Cross-site request forgery) 

사이트간 위조 방지를 목적으로 특정한 값의 토큰을 사용하는 방식

예) URI를 통해서 접속자의 권한을 관리자 권한으로 바꾸는 것

- 서버가 접속한 클라이언트에게 특정 CSRF토큰을 전달한다.

- 클라이언트는 서버에 접속 할 때마다 CSRF값을 가지고 온다.

- 서버는 클라이언트의 CSRF값과 서버에 보관된 CSRF값을 비교하여 동일한 사용자 접속인지 확인하고 서비스를 제공해준다.

 

 

 

Spring Security 설정방법

설정 방법에는 두가지가 있다.

 xml 또는 java 기반의 설정을 할수 있다.

 

 

Security - java 기반의 환경설정과 사용방법

 

1. pom.xml에 API를 추가

📑 pom.xml

<org.springsecurity-version>5.0.2.RELEASE</org.springsecurity-version>

1) <properties> ...</properties> 안에 Spring Security 버전 추가

 

<!-- Spring security-->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${org.springsecurity-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${org.springsecurity-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>${org.springsecurity-version}</version>
</dependency>

2) Spring Security Api 추가 

 

 

 

 

2. Spring Security 의 환경설정 파일이 필요

📑 SecurityConfig

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		// 요청에 대한 설정
	}
	

}

1) WebSecurityConfigurerAdapter클래스를 상속하여 SecurityConfig객체를 생성

- @EnableWebSecurity는 스프링MVC와 스프링 시큐리티를 결합하는 클래스이다.

 

2) configure 메서드 오버라이드

 

3) 오버라이딩된 configure 안에 한글이 가능하게 언어를 세팅해서 깨지지 않게 한다.

@Override
protected void configure(HttpSecurity http) throws Exception {
    //요청에대한 보안 설정~~
    CharacterEncodingFilter filter = new CharacterEncodingFilter();
    filter.setEncoding("UTF-8");
    filter.setForceEncoding(true);
    http.addFilterBefore(filter,CsrfFilter.class);	
}

 

 

 

3. Spring Security 가 동작하는 클래스 생성

1) AbstractSecurityWebApplicationInitializer클래스를 상속하여 SecurityInitializer를 생성

- 내부적으로 DelegatingFilterProxy를 스프링에 등록하여 스프링 시큐리티를 내부적으로 동작시킨다.

package kr.board.config;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SecurityInitializer extends 
                      AbstractSecurityWebApplicationInitializer{

}

 

📑 WebConfig

@Override
protected Class<?>[] getRootConfigClasses() {
    // TODO Auto-generated method stub
    return new Class[] {RootConfig.class,SecurityConfig.class};
}

4) SecurityConfig.class의 연결을 추가해준다.

 

 

 

 

3. 사용자 화면에서 토큰 값 전달 방법

** 사용자 화면에서 토큰 값을 전달하면, 위에서 설정한 파일들이 토큰값을 비교하고 확인해주는 역할을 실행해준다.

** 설정 후 사용자 화면에서 post/Rest(put, delete) 방식으로 값을 서버로 넘길 경우 토큰을 넘겨주는 내용을 추가하지 않는다면 에러가 생기게 된다.

 

var csrfHeaderName = "${_csrf.headerName}";
var csrfTokenValue = "${_csrf.token}";
function boardList(){ 
    $.ajax({
        url : "${cpath}/board",
        type : "get",
        dataType : "json",
        beforeSend: function(xhr){
        	xhr.setRequestHeader(csrfHeaderName, csrfTokenValue)
        },
        success : callBack,
        error : function(){ alert("error"); }
    });
}

1) ajax 형식에서 토큰 값 넘기기

beforeSend: function(xhr){
         xhr.setRequestHeader(csrfHeaderName, csrfTokenValue)

},

 

<form>
	<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>

2) form 태그에서 post으로 넘기기

 

<form action="${contextPath}/memImageUpdate.do?${_csrf.parameterName}=${_csrf.token}" 
method="post" enctype="multipart/form-data">
</form>

3) 파일 업로드가 되는 form 태그에서는 Get 방식으로 URI 뒤에 파라미터로 토큰을 넘겨준다.

 

 

 

profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!