fastcampus 웹 개발 마스터 초격차 패키지를 수강하며 정리한 내용들입니다.
spring:
security:
user:
name: 로그인시 사용할 이름
password: 로그인시 사용할 비밀번호
roles: USER
@RestController
public class HomeController {
@RequestMapping("/")
public String index(){
return "홈페이지";
}
// url에 접근할 때, 사용자가 어떤 권한을 가지고 접근하는지 Authentication을 사용해 확인해 볼 수 있다.
@RequestMapping("/auth")
public Authentication auth(){
return SecurityContextHolder.getContext()
.getAuthentication();
}
// 접근한 사용자에 대한 권한과 어떤 페이지에 접근 했는지에 대해 확인하는 메서드
// @PreAuthorize = 해당 페이지에 접근할 수 있는 사용자에 대한 권한을 지정한다.
@PreAuthorize("hasAnyAuthority('ROLE_USER')")
@RequestMapping("/user")
public SecurityMessage user(){
return SecurityMessage.builder()
.auth(SecurityContextHolder.getContext().getAuthentication())
.message("User 정보")
.build();
}
@PreAuthorize("hasAnyAuthority('ROLE_ADMIN')")
@RequestMapping("/admin")
public SecurityMessage admin(){
return SecurityMessage.builder()
.auth(SecurityContextHolder.getContext().getAuthentication())
.message("관리자 정보")
.build();
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SecurityMessage {
private Authentication auth;
private String message;
}
{
"authorities": [
{
"authority": "ROLE_USER"
}
],
"details": {
"remoteAddress": "",
"sessionId": ""
},
"authenticated": true,
"principal": {
"password": null,
"username": "user2",
"authorities": [
{
"authority": "ROLE_USER"
}
],
"accountNonExpired": true,
"accountNonLocked": true,
"credentialsNonExpired": true,
"enabled": true
},
"credentials": null,
"name": "user2"
}
{
// 위와 동일하게 보여주며, 추가로 작성한 message를 보여준다.
"message": "User 정보"
}
이처럼 페이지에 접근하는 사용자에 대한 개인정보를 보호하기 위해 스프링 시큐리티를 사용한다.
config/SecurityConfig
@EnableWebSecurity(debug = true) // request가 올 때마다 어떤 filter chain을 거치고 있는지 콘솔창에 보여준다.
@EnableGlobalMethodSecurity(prePostEnabled = true) // 권한을 확인하는 모듈을 사용할 수 있다.
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// WebSecurityConfigurerAdapter 필터 체인을 구성하는 configuration class
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser(User.builder()
.username("user2")
.password(passwordEncoder().encode("2222"))
.roles("USER")
).withUser(User.builder()
.username("admin")
.password(passwordEncoder().encode("3333"))
.roles("ADMIN"));
}
// 위에서 계정을 생성할 때 비밀번호를 따로 인코딩하지 않으면 오류가 발생하므로
// BCryptPasswordEncoder를 사용한다.
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
// security filter 설정
@Override
protected void configure(HttpSecurity http) throws Exception {
// http.antMatcher("/**"); // 모든 request에 대해서 filter를 거치게 설정
// http.antMatcher("/api/**"); // 특정 api 밑의 request들만 filter를 거치게 설정
// 스프링 시큐리티는 기본적으로 모든 페이지에 대한 접근을 막기 때문에
// "/" 즉, 홈페이지에 대해서는 모든 접근을 허용하도록 변경한다.
http.authorizeRequests((requests) ->
requests.antMatchers("/").permitAll()
.anyRequest().authenticated());
http.formLogin();
http.httpBasic();
}
}
http.headers().disable()
.csrf().disable()
.logout().disable()
.requestCache().disable();