[스프링 시큐리티] 의존성 추가와 사용을 위한 설정

코린이서현이·2024년 5월 25일
0
post-thumbnail

💦들어가면서💦

원래 초반에는 뭘 배우는지 모르는게 정상이긴 함.
그래서 정상 추 드림

하여튼 이번 파트에서는 스프링 시큐리티 의존성을 추가하고, 
의존성을 추가한 후에 어떤 변화가 있는지 살펴볼 것이다. 

🛠️ 의존성을 추가해보자.

		<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(); 이란?

    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"); //직접 설정한 로그인 페이지로 로그인페이지를 설정
//    }

어떻게 변했을까??

WebSecurityConfigurerAdapter란?

이 클래스는 스프링 시큐리티 보안 기능의 초기화와 설정을 담당한다.

따라서 이 클래스를 상속받은 SecurityConfig는?

사용자가 직접 정의해서 보안기능을 설정할 수 있도록 하는 클래스다.

configure 메서드

예전엔 WebSecurityConfigurerAdaptercofigure 메서드를 오버라이딩ㅎ 통해서 사용했지만, 지금은 @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();

    }

}

잘 작동하는 지 확인하기

  • 기본 페이지는 로그인 없이도 접근 가능!

  • 로그인 페이지는 우리가 만든 로그인 요청주소로!!

  • 권한이 필요한 페이지는 로그인 페이지로 바뀌기!! (캡쳐하기가 어렵지만 잘 작동된다~!)

마무리 하면서

정리!

느낀 점🫶

profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글