1. Initial Setup]Spring Security for REST API with Spring Boot 3.x

손지민·2023년 12월 6일

Spring Security

목록 보기
1/11
post-thumbnail

개요

Spring boot 3.x 로 적용한 프로젝트에서 iOS와의 협업을 위해 REST API 로 로그인을 구현하는 과정에 공부 내용을 기록해보고자 합니다.

이 단계에서는 WebSecurityConfig 생성하여 시큐리티를 활성화합니다. 또한 REST API 사용을 위해서 시큐리티가 기본 제공하는 로그인 form 을 비활성화하고, 페이지 권한 설정 등을 합니다.

공부 중이므로 틀린 내용, 의견, 질문 있으시면 댓글 달아주시면 감사하겠습니다.

전체 구조

Initial setup

  1. REST API 로 만들 것이기 때문에 Postman 필요합니다.
  2. Spring Security 의존성을 추가한다. Maven, Gradle 에 따라 추가합니다. 이 사항은 Spring initailzr 사용 시 알아서 의존성 추가되므로 따로 기재하지않았습니다.

1. WebSecurityConfig 생성

일단 Security가 제공하는 로그인 화면 띄우기

package com.ward.ward_server.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
    @Bean
    public SecurityFilterChain applicationSecurity(HttpSecurity http) throws Exception {
        http
                .cors(AbstractHttpConfigurer::disable)
                .csrf(AbstractHttpConfigurer::disable)
                .formLogin(Customizer.withDefaults())
                .securityMatcher("/**") // map current config to given resource path
                .sessionManagement(sessionManagementConfigurer
                        -> sessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

        return http.build();
    }
}

1.1 만난 문제

  • <오류>.formLogin(Customizer.withDefaults())
    이게 안들어가 있으면 로그인 화면이 안뜨고 계속 Whitelabel Error Page 뜸.

tip
어차피 쓸 일은 없지만 시큐리티가 제공하는 로그인 폼에 로그인하기 위한 ID: user/Password 는 어플 가동 시 콘솔에 뜨는 Using generated security password 입력하면 됩니다.

1.2 어노테이션 설명

@Configuration

이 어노테이션은 Spring Framework에서 사용되며, 해당 클래스가 하나 이상의 빈을 정의하고, 빈 간의 의존성을 설정하는 Java 기반의 설정 클래스임을 나타냅니다. 이 어노테이션이 적용된 클래스는 ApplicationContext에 의해 관리되며, 애플리케이션의 구성과 런타임 동작을 결정하는 역할을 합니다.

@EnableWebSecurity

이 어노테이션은 Spring Security를 웹 기반 보안 구성에 사용하기 위한 설정을 활성화하는데 사용됩니다. 이 어노테이션을 사용하면 Spring Security의 다양한 웹 보안 기능을 사용할 수 있게 됩니다.

2. WebSecurityConfig 수정

RestAPI 라서 로그인폼x, 권한설정

package com.ward.ward_server.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
    @Bean
    public SecurityFilterChain applicationSecurity(HttpSecurity http) throws Exception {
        http
                .cors(AbstractHttpConfigurer::disable)
                .csrf(AbstractHttpConfigurer::disable)
                .securityMatcher("/**") // map current config to given resource path
                .sessionManagement(sessionManagementConfigurer
                        -> sessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .formLogin(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests(registry -> registry // 요청에 대한 권한 설정 메서드
                        .requestMatchers("/").permitAll() // / 경로 요청에 대한 권한을 설정. permitAll() 모든 사용자, 인증되지않은 사용자에게 허용
                        .anyRequest().authenticated() // 다른 나머지 모든 요청에 대한 권한 설정, authenticated()는 인증된 사용자에게만 허용, 로그인해야만 접근 가능
                );

        return http.build();
    }
}

2.1. 어노테이션 설명

  • @Configuration 및 @EnableWebSecurity 어노테이션:
    @Configuration: 이 클래스가 Java 기반의 구성 클래스임을 나타냅니다.
  • @EnableWebSecurity: Spring Security를 활성화하고 웹 보안을 구성하기 위한 어노테이션입니다.
  • @Bean 메서드 applicationSecurity:
    이 메서드는 SecurityFilterChain을 생성하여 보안 구성을 정의합니다.

2.2. 메서드 설명

  • http.cors(AbstractHttpConfigurer::disable) 및 http.csrf(AbstractHttpConfigurer::disable):
    CORS(Cross-Origin Resource Sharing) 및 CSRF(Cross-Site Request Forgery)를 비활성화합니다.
  • http.securityMatcher("/"):
    현재 설정을 모든 리소스 경로에 매핑하도록 지정합니다.
  • http.sessionManagement(...):
    세션 관리 정책을 설정합니다. 여기서는 SessionCreationPolicy.STATELESS를 사용하여 상태를 유지하지 않는 세션을 설정합니다.
  • http.formLogin(AbstractHttpConfigurer::disable):
    폼 기반 로그인을 비활성화합니다. 이 설정은 API 서버와 같이 폼 로그인이 필요하지 않은 경우에 유용합니다.
  • http.authorizeHttpRequests(...):
    HTTP 요청에 대한 권한을 설정합니다. 여기서는 / 경로는 모든 사용자에게 허용하고, 그 외의 모든 요청은 인증된 사용자에게만 허용합니다.
  • return http.build();:
    설정을 기반으로 한 SecurityFilterChain을 반환합니다.
  • requestMatchers("/"): / 경로에 대한 요청에 대한 권한을 설정합니다.
  • permitAll(): 모든 사용자에게 허용한다는 의미로, 이 경로에 대한 모든 요청은 인증되지 않은 사용자에게 허용됩니다.
  • anyRequest(): 다른 모든 요청에 대한 권한을 설정합니다.
  • authenticated(): 해당 요청은 인증된 사용자에게만 허용된다는 의미로, 사용자가 로그인되어 있어야만 해당 요청에 접근할 수 있습니다.

참고

profile
Developer

0개의 댓글