스프링 시큐리티(Spring Security)를 사용하는 이유는 웹 애플리케이션 사용시 사용자 아이디와 비밀번호를 인증을 할 수 있게 하여 URL마다 특정 권한이 있는 사용자만 접속이 가능하게 할수도 있게 하고 사용자 비밀번호를 편하게 암호화 할 수 있다.
스프링 시큐리티 연동
스프링 시큐리티 사용하려면 아래 스프링 시큐리티 dependency 추가(test는 의존성은 추가 안해도됨)
<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>
스프링 시큐리티 의존성을 추가하고 나면 모든 요청은 인증을 필요로 하고, 기본 유저가 생성된다.
- Username : user
- Password : 콘솔에 출력된 문자열
요청 인증 form과 콘솔에 출력된 password
하지만 이대로 웹 애플리케이션을 사용할수 없다 왜냐하면 모든 요청에서 인증을 하기 때문에 인증 없이 접근 가능한 URL도 있어야 하고, 유저 계정이 하나뿐인것 또 비밀번호가 로그에 남기 때문이다. 그래서 스프링 시큐리티 설정이 필요하다
스프링 시큐리티 설정
@Configurable
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.mvcMatchers("/", "info", "/account/**").permitAll()
.mvcMatchers("admin").hasRole("ADMIN")
.anyRequest().authenticated(); //다른 url들은 인증만하면 접근가능하다.
http.formLogin();
http.httpBasic(); //http 기본인증 사용
}
}
- 스프링 웹 시큐리티를 설정 클래스를 만들려면 @Configuration, @EnableWebSecurity 애노테이션과 WebSecurityConfigurerAdapter 클래스를 상속 받아야 한다.
- http.authorizeRequests() 메서드로 특정한 경로에 특정한 권한을 가진 사용자만 접근할 수 있도록 설정할 수 있다.
- mvcMatchers() : 특정 경로를 지정해서 권한 설정 가능
- formLogin() : 인증이 필요한 요청은 스프링시큐리티에서 사용하는 기본 Form Login Page 사용
- httpBasic() : http 기본인증 사용
※ antMatchers, mvcMatchers 차이
특정경로 지정해서 권한을 설정할때 antMatchers, mvcMatchers가 있는데 antMatchers는 URL 매핑 할때 개미패턴, mvcMatchers는 mvc패턴이다. antMatchers(”/info”) 하면 /info URL과 매핑 되지만 mvcMatchers(”/info”)는 /info/, /info.html 이 매핑이 가능하다.
인메모리 유저 추가
유저를 만드는 클래스는 UserDetailsServiceAutoConfiguration 클래스 에서 왔다.
이 클래스를 보면 아래처럼 SecurityProperties 로 계정을 생성하는 방법이 있지만 소스에 사용자 정보가 있으므로 사용하지 않는다.
spring.security.user.name=admin
spring.security.user.password=123
spring.security.user.roles=ADMIN
인메모리에서 유저 설정
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("kang").password("{noop}123").roles("USER").and()
.withUser("admin").password("{noop}!@#").roles("ADMIN");
}
- AuthenticationManagerBuilder를 제공하는 configure메서드 오버라이딩을 한다. 이 메서드로 원하는 유저를 임의대로 설정할 수 있다.
- 인메모리 유저 설정은 inMemoryAuthentication() 메서드를 사용한다.
- noop은 스프링 시큐리티에서 제공하는 기본 패스워드 인코더방식인데 암호화를 하지 않았다는 것이다.
- {}안에 다른 인코딩 방식을 사용한다면 웹 화면에서 입력한 password가 {}인코딩방식으로 인코딩된 값하고 비교가 된다. ex) {bcrypt}#oijowefijwoj0192310j
백기선 스프링 시큐리티 강의 참고
'Language > Spring' 카테고리의 다른 글
[Spring] id 키값 타입Long을 UUID로 변경하기(H2 DB, JPA 사용) (0) | 2024.01.30 |
---|---|
[SpringBoot] IntelliJ 에서 스프링부트 DevTools 사용법과 실행원리 (0) | 2021.12.01 |
[SpringBoot] 기능구현한 코드를 코드로 테스트 하는방법및 주의사항 (0) | 2021.11.23 |
[SpringBoot] 웹개발 3가지 방식과 동작원리 (2) | 2021.11.22 |
[SpringBoot] 스프링부트 Gradle 프로젝트 빌드하고(jar파일 생성) 실행하는법 (0) | 2021.11.11 |