[데브코스] Spring Security - Basic
Updated: Categories: TILW15D1 - 보안 요소와 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
클래스를 확인해보면 아래와 같이 프로퍼티를 불러오기에 가능함.
방법 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가 변경된다.