본문 바로가기
WEB/Back-end

Spring Security(SpringBoot)

by 최새벽 2024. 10. 15.

스프링 시큐리티 시작하기

//  dependencies
    implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'

build.gradle에서 의존성 주입

 

들어가면 기본화면으로 나옴

 

id는 user

pw는 콘솔창에서 확인할 수 있음

 

로그인하면 해당 ID/PW로 초기 화면 로그인할 수 있음

 

시큐리티 설정 클래스 작성

java/사용패키지(org.example.club)/config/SecurityConfig

 

 

스프링 시큐리티는 여러개의 객체가 서로 데이터를 주고 받으며 이루어지는데

filter를 통해 Authentication manager 에서 AuthenticationProvider를 호출?하고 UserDetailsService를 통해 접근 권한에 따라 필터링을 해준다 

 

Authentication manager 

인증(Authentication)이라는 타입의 객체로 작업 

파라미터, 리턴 타입 둘다 인증임

@Configuration // 설정 파일임
@EnableWebSecurity // 시큐리티 설정임
@Log4j2 // 로그
public class SecurityConfig {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
        UserDetails user = User.builder() // 스프링 security 안에 있는 내용
                .username("user1")
                .password(passwordEncoder().encode("1111"))
                .roles("USER")
                .build();
        return new InMemoryUserDetailsManager(user);
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((auth) -> {
            auth.requestMatchers("/sample/all").permitAll(); // 로그인 없이 접속 가능
//           auth.antMatchers("sample/all")  -> 이전 버전에서 사용하던 방식. 지금은 안됨
        });
//        http.formLogin(); -> 이전 방식에서 사용하던 방식. 지금은 사용 못함
        return http.build();
    }
}

 

 

 

설정으로 인해 권한 없는 페이지에 접속하면 403에러 발생(40.. 클라이언트 에러)

 

 

스프링 시큐리티 CSRF 대비

크로스 사이트 요청 위조(request forgery) 공격을 방어하기 위해 임의의 값을 만들어 get 방식을 제외한 모든 요청 방식에포함 시켜야 정상 동작이 가능함.

즉, POST, PUT, DELETE 등의 방식으로 전송할 때 token이 있어야 함

config에서 비활성화 시킬 수도 있음

// 토큰 비활성화
http.csrf(csrf->csrf.disable());

 

 

 

 

[사용자 로그인 설정하면 접속이 안됨]

로그인도 requestMatcher에 포함시켜줘야 함

시큐리티 입장에서 /login도 인증이 필요한데, 인증 페이지가 login으로 넘어가므로

계속 login이 redirection되어서 위의 에러 발생

http.authorizeHttpRequests((auth) -> {
// auth.antMatchers("sample/all")  -> 이전 버전에서 사용하던 방식. 지금은 안됨
    auth.requestMatchers("/sample/all").permitAll() // 로그인 없이 접속 가능
            .requestMatchers("/login").permitAll() // 로그인 페이지도 로그인 없이 접근 허용
            .requestMatchers("/sample/member").hasRole("USER"); // USER role을 부여받은 사용자만 접속 가능
});

시큐리티 config에서 위 수정 

 

<form method="post">
    username: <input type="text" name="username"><br>
    password: <input type="password" name="password"><br>
    <button type="submit">Login</button>
    <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
</form>

 token이 있어야 로그인 내용이 요청됨

 

[컨트롤러??]

post 방식의 로그인 방식은 이미 시큐리티 기본 설정에 있으므로 컨트롤러에서 해당 요청에 대한 코드 작성하지 않아도 됨

 

[ROLE_USER]

스프링 시큐리티에서는 USER라는 단어를 상수처럼 사인증된 사용자를 의미하는 용도로 사용함

 

 

 

[이전 페이지가 없다면?]

특정 페이지로 들어갔는데 권한이 필요해서 로그인을 하는경우 해당 페이지로 가게 됨

그러나, 직접 로그인으로 치고 들어가면 이전페이지에 대한 정보X

defaultSuccessUrl

http.formLogin(e->{ // 로그인 커스텀 할 수 있다
    e.loginPage("/login");
    e.defaultSuccessUrl("/sample/all"); // 이전페이지가 없는 경우 로그인에 성공하면 접속하게되는 페이지
});

 

 

'WEB > Back-end' 카테고리의 다른 글

JWT(Json Web Token)  (0) 2024.10.15
Spring Framework 및 API 개발 개요  (1) 2024.10.15
EntityGraph (SpringBoot)  (0) 2024.10.15
@ManyToOne와 @OneToMany(SpringBoot)  (0) 2024.10.15
Thymeleaf 레이아웃 템플릿 (SpringBoot)  (0) 2024.08.23