원래 초반에는 뭘 배우는지 모르는게 정상이긴 함.
그래서 정상 추 드림
하여튼 이번 파트에서는 스프링 시큐리티 의존성을 추가하고,
의존성을 추가한 후에 어떤 변화가 있는지 살펴볼 것이다.
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
package com.jsh.securitystudy.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@Controller
public class IndexController {
@GetMapping({"/",""})
public @ResponseBody String index() {
return "index";
}
@GetMapping("/user")
public @ResponseBody String user() {
return "user";
}
@GetMapping("/admin")
public @ResponseBody String admin() {
return "admin";
}
@GetMapping("/manager")
public @ResponseBody String manager() {
return "manager";
}
@GetMapping("/login")
public @ResponseBody String login() {
return "login";
}
@GetMapping("/join")
public @ResponseBody String join() {
return "join";
}
@GetMapping("/joinProc")
public @ResponseBody String joinProc() {
return "회원가입 완료";
}
}
그러면 어떤 변화가 있을까??
✔️ 프로젝트를 시큐리티가 보호해주고, 해당 프로젝트에 접근하려고 하면 시큐리티 로그인 창이 나타난다. 해당 로그인에서 사용할 수 있는 키도 제공해준다.
✔️ 해당 키로 접근 한 후에는 다른 주소로 접근이 가능하다.
✔️ 그러나 login
에 대해서는 다시 시큐리티가 재 설정이 된다.
😅 ㅇㄴ 그러면 매번 이 키를 받아서 써야하는 건가..?
🙅♂️ 당연히 아님!!
로그인을 하지 않아도 접근할 수 있는 페이지등을 따로 설정해둘 수 있다.
강의 내용의 코드
@Configuration
@EnableWebSecurity //활성화 -> 스프링 시큐리티 필터가 스프링 필터페인에 등록이 된다.
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf.disable();
http.authorizeRequests()
.antMatchers("/user/**").authenticated()
.antMatchers("/manager/**").access()
.antMatchers("/user/**").authenticated("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANGER')")
.antMatchers("/admin/**").authenticated("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/login");
}
}
그런데 2022년부터 WebSecurityConfigurerAdapter를 제공하지 않는다...
하지만 오히려 좋아 🫶 내가 직접 공부할 수 있는 좋은 기회 아닙니까~!
http.csrf.disable();이란??
* csrf : 공격자가 안전한 사용자의 요청을 바꾸는 공격
* csrf.disable() : 스프링 시큐리티가 csrf에대한 보호를 비활성화하는 것
?? 왜 -> 이 사이트가 REST API 서비스니까 (자세한 내용은 다음에.. 총총총)
! 이제는 : -> http.csrf(AbstractHttpConfigurer::disable)
// http.authorizeRequests() -> : HTTP 요청에 대한 인증 요구 사항을 설정하기 위한 메서드
// .antMatchers("/user/**").authenticated() -> 인증이 된 사용자에게 허용
// .antMatchers("/manager/**").access("접근제어표현식") -> 접근제어표현식에 따라 접근 허용
// .antMatchers("/user/**").authenticated("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANGER')")
// .antMatchers("/admin/**").authenticated("hasRole('ROLE_ADMIN')")
// .anyRequest().permitAll() -> 이외의 요청은 권한이 없더라도 모두 허용해줌
// .and()
// .formLogin() //로그인 방식을 사용하는 것으로 설정
// .loginPage("/login"); //직접 설정한 로그인 페이지로 로그인페이지를 설정
// }
이 클래스는 스프링 시큐리티 보안 기능의 초기화와 설정을 담당한다.
따라서 이 클래스를 상속받은 SecurityConfig는?
사용자가 직접 정의해서 보안기능을 설정할 수 있도록 하는 클래스다.
예전엔 WebSecurityConfigurerAdapter
의 cofigure
메서드를 오버라이딩ㅎ 통해서 사용했지만, 지금은 @Bean
메소드를 생성후 결과값을 리턴해주는 방식을 사용한다.
즉, 설정 값을 리턴해주는 방식인 것이다.
계속 시도해도 안되서 그냥 다른 글에서 해결하고 왔어요!🫶 👉 [글 보러가기]
package com.jsh.securitystudy.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.*;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class MySecurityConfig{
@Bean //빈으로 등록하기
SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http
.csrf(csrf -> csrf.disable())
.authorizeRequests((authorizeRequests) ->
authorizeRequests
.requestMatchers("/user/**").authenticated()
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/manager/**").hasAnyRole("ADMIN","MANGER"))
.formLogin(formLogin -> formLogin
.loginPage("/login"));
return http.build();
}
}
기본 페이지는 로그인 없이도 접근 가능!
로그인 페이지는 우리가 만든 로그인 요청주소로!!
권한이 필요한 페이지는 로그인 페이지로 바뀌기!! (캡쳐하기가 어렵지만 잘 작동된다~!)