[데브코스] Spring Security - Basic

Updated: Categories:

W15D1 - 보안 요소와 Spring Security 기초부터 알아보자

보안

  • 인증(Authentication) : 사용자의 신원을 확인하는 것
  • 인가(Authorization) : 사용자 권한에 따라 특정 기능 수행 및 데이터 접근 허용
  • 크레덴셜(Credential) : 자격 증명 방법을 지칭 (ex. 비밀번호)
  • 전송 레이어 보안 : SSL 적용, HTTPS


Spring MVC Security

설정

  • maven 기준
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-test</artifactId>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.thymeleaf.extras</groupId>
  <artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>

Config

  • WebSecurityConfigurerAdapter를 상속받는 컴포넌트를 생성하기
    • @EnableWebSecurity 어노테이션으로 어플리케이션 전체에 적용한다
  • configure 메소드의 인자값에 따라 보안 영역을 설정할 수 있다.
    • WebSecurity : 웹 전역 보안설정
    • HttpSecurity : http 요청에 인증, 인가 설정
@Configuration
@EnableWebSecurity
public class WebSecurityConfigure extends WebSecurityConfigurerAdapter {

    // 전역 보안설정
    @Override
    public void configure(WebSecurity web) {
        web.필터체인 
        ...
    }

    // http 보안 설정
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.필터체인 
        ...
    }
}


Filter Chain

  • WebSecurity를 설정하는 메소드에서는 FilterChainProxy를 통해 여러 필터를 거치게된다.
  • 별도의 설정이 없다면 모든 필터(14개)를 불러와 실행하게 됨.
  • 따라서 필터가 필요없는 (보안이 필요없는) 요소에는 .ignoring()을 체이닝해줘 필터링을 생략하게 한다.
    • 서버 자원 절약!
    • 일반적으로 보안이 필요없는 정적 리소스는 예외시켜준다.
@Override
public void configure(WebSecurity web) {
    web.ignoring.antMatchers(생략할 리소스);
    ...
}


InMemory User

  • 인메모리 방식으로 사용자를 등록시켜놓을 수 있다.

방법 1

  • application.yaml에 작성하기
spring:
 security:
   user:
     name: 이름
     password: 비번
     roles: 역할
  • 하지만 단 하나의 유저만 등록할 수 있다.
  • UserDetailsServiceAutoConfiguration -> SecurityProperties 클래스를 확인해보면 아래와 같이 프로퍼티를 불러오기에 가능함.

image

방법 2

  • AuthenticationManagerBuilder를 사용한다
  • 여러 유저를 등록할 수 있다.
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
            .withUser(아이디).password(비번).roles(규칙).and()
            .withUser(아이디).password(비번).roles(규칙)
            ...
            ;
}


Password

DelegatingPasswordEncoder

  • Spring Secrity 5부터 DelegatingPasswordEncoder가 기본 PasswordEncoder로 지정된다.
  • DelegatingPasswordEncoder의 규칙대로 비밀번호를 저장할때 사용할 암호화 알고리즘에 따라 prefix를 붙여주면된다.
{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
{noop}password
{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0
  • prefix 생략시 자동으로 Bcypt로 지정됨.
  • InMemoryUserDetailsManager 객체(구현체)를 사용한다면 최초 로그인 1회 성공시, {noop} 타입에서 → {bcrypt} 타입으로 PasswordEncoder가 변경된다.