티스토리 뷰

Security

 

서론

Spring Security는  Spring으로 웹을 개발한다면 필수적인 프레임워크이다. 왜일까? 기본적인 세션관리 HTTP 보안 및 어플리케이션 보안을 담당준다. 초기 설정은 생각보다 복잡하다. 그리고 개발자마다 시큐리티를 적용한 방법이 각기 다르다. 어플리케이션 특징마다 설정값은 다르지 몰라도 초기 세팅 방법은 개발자마다 다르기에 구조와 원리를 이해 못하면 접근하기 어렵다. 필자는 최대한 쉬운방법으로 입문자 들에게 소개하고자 한다.

 

아래 포스팅 순서대로 따라한다면, 동작하는데 무리가 없다고 생각한다.

 

들어 가기에 앞서 .. 알아야될 개념

DB 기초 모델링

Spring을 이용해 최소 한개 웹페이지 만들어본 경험 (세션과 인증,보안이 중요한 이유를 알아야 하기에..)

 

 

필자 개발 환경 19.08.13 기준

Spring Boot 2.1.6 v

Spring-boot-starter-security 최신 버전

Thymeleaf 최신 버전

Mybatis 2.0.1 v

Mysql 최신 버전 

 

Spring Security 인증 구조와 원리

이부분 부터 졸음이 올지 모른다..ㅠ 필자 생각으로 알아야 될 핵심 개념 위주로 작성해본다. 구체적으로 알고 싶다면 해당 문서에 들어가서 공부하면 되겠다 :)

Security 인증 구조

 

이 순서를 외울 필요도 없고 알아야될 의무도 없다.

위 구조를 개발자가 다 커스텀마이징 할필요도 없다. 가장 중요한 부분은 4번 부터 8번까지이다.

Manager로 부터 값을 받아와 Porvider 부터 UserDetails 까지 이부분이 개발자 서로 자기 입맛에 맞게 구성 했기 때문에 이부분만 자기가 커스텀 마이징 할줄알면 사실상 시큐리티는 끝이다. !!!  

 

순서대로 각 역할을 설명 짧게 설명하겠다.

1-3 번까지는 간단한 개념을 설명하고 4-8번까지는 코드로 설명 하겠다.

 

1. AuthenticationFilter가 Request 요청

 Filter에서 아이디와 비밀번호가 null인지 혹은 체크 하기 위해서다.

뭐 자바스크립트로도 개발자가 하겠지만 시큐리티가 한번 더해준다는 의미다.

 

2. Filter로 유효하다 판단되면 인증용 객체(토큰)이 생성

 

3. Manager는 실제 인증을 할 AuthenticationProvider 에게 전달한다. 

 

4-8번까지는 아무리 개념을 설명해도 자기가 직접 구현해야 되는 부분이기에 코드로 설명을 하겠다.

 

아래 글부터 차례 차례 따라하면 되겠다.

 

Spring Security Maven 등록
<!--Security-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

 

Security Config 클래스 등록
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	
    @Override
    protected void configure(AuthenticationManagerBuilder auth) {
      //실제 인증을 진행할 Provider 
    }
    
    @Override
    public void configure(WebSecurity web) {
	  //이미지,자바스크립트,css 디렉토리 보안 설정 
	}

    @Override
    protected void configure(HttpSecurity http) throws Exception {
	 //HTTP 관련 보안 설정 **가장 중요   
	}
}

시큐리티를 설정할 클래스에 @Configuration 와 @EnableWebSecurity를 넣어줍니다.

위 소스를 보듯이 3개의 configure 메소드를 오버라이딩 한다. 

 

여기서 부터 이제 개발자 마다 구현하는 방법이 각각 다르다.

필자 방법보다 다른 방법을 선택하고 싶다면 여기서부터

오버라이딩한 각각의 메소드를 검색해 다른 개발자는 어떻게 구현했는지 살펴보면 되겠다.

정답은 없다. 

 

오버라이딩한 메소드 부가 설명 

AuthenticationManagerBuilder 를 매개변수로 받는 configure메소드 :

여기서 DB 로부터 아이디,비번이 맞는지 해당 유저가 어떤 권한을 가지는지를 체크한다.

위에 언급한 인증 구조중에 4번에 해당,

UserDetailsService 인터페이스를 상속받은 클래스가 있다면 그 클래스에서 인증을 시도 하면된다. 

 

Websecurity를 매개변수로 받는 configure 메소드 :

이미지 파일, css 파일, 자바스크립트 파일 을 접근 가능하게 처리하는 소스를 입력하면 된다.

 

HttpSecurity를 매개변수로 받는 configure 메소드 :

이 메소드에서 URL 별 권한 설정, 로그인,세션 등등 HTTP 보안 관련 설정을 해주면 된다.

 

UserDetailService 구현
@Service
public class SecurityService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String id) throws UsernameNotFoundException {
       
       return null;
    }
}

 

인증 구조중에 5번에 해당하는 구간이다.

UserDetailService를 받으면 loadUserByUsername 메소드를 오버라이딩 해야한다.

이 메소드에서 DB로 아이디 값을 체크하면 끝이다!!! 

Return 값으로 인증구조 6번인 UserDetails를 반환해주면 시큐리티는 구조는 이해 한것이다.

 

마치며 ...

다음 2번째 포스팅때 config 클래스와 UserDetailService를 실전에 맞게 구현할 예정이고 DB를 설계해 직접 인증 테스트를 진행할 예정이다.