미루고 미루던 Spring Security 공부를 시작해보겠습니다.
요즘 DP 공부하느라 다른 공부는 미뤄 왔었는데, 생각해보니 학기 중에 RestAPI랑 Spring Security로 개인 프로젝트 하나 만들기 위해서는 Spring Security를 빨리 해놔야 학기 중에 프로젝트 만들기가 편할 것 같더라구요.
일단 Spring Security와 JWT를 활용하여 사용자 로그인, JWT 토큰 생성, 사용자 확인 등의 기능을 구현해보고자합니다.
다음과 같이 Spring.io를 통하여 의존 관계를 설정해줍니다.
일단 프로젝트를 실행한 뒤에 간단하게 패키지 정도만 만들어 준 뒤에 사용자 정보를 담기 위한 Entity를 생성해줍니다.
package chrkb1569.LoginAPI.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name; // 사용자 이름
@Column(nullable = false, unique = true)
private String userId; // 사용자 아이디
@Column(nullable = false, unique = true)
private String email; // 사용자 email
@Column(nullable = false)
private Long age; // 사용자 나이
}
잘 실행되는 것으로 보아, 오류없이 잘 넘어간 것 같습니다.
그럼 User Entity에 해당하는 Controller, Repository, Service 파일도 일단 대충은 만들어줍시다.
package chrkb1569.LoginAPI.controller;
import chrkb1569.LoginAPI.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
@Controller
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
}
package chrkb1569.LoginAPI.repository;
import chrkb1569.LoginAPI.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
package chrkb1569.LoginAPI.service;
import chrkb1569.LoginAPI.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
}
일단 기본적으로 프로젝트의 기본 틀을 만들어 주었다면, Spring Security를 활용하기 위하여 별도의 파일을 하나 생성해주어야합니다.
config라는 패키지를 생성한 뒤에, SecurityConfig 파일을 생성해줍니다.
해당 파일은 Spring Security에서 활용하는 보안과 관련된 설정을 하는 파일인데, 이는 어노테이션 @EnableWebSecurity를 통하여 설정해줄 수 있습니다.
package chrkb1569.LoginAPI.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http.build();
}
}
여기서 중요한 부분은 바로 @EnableWebSecurity인데, 그 이유는 바로 해당 어노테이션을 활용하는 과정에서 옛 자료들과 다른 부분이 존재하기 때문입니다.
@EnableWebSecurity 어노테이션은 기본적인 Web의 보안을 설정해주는 어노테이션으로, 보통 클래스에 선언해주어 해당 클래스를 통하여 보안과 관련된 설정을 진행해줍니다.
이때, 해당 클래스 파일로 WebSecurityConfigurerAdapter를 상속 받거나, WebSecurityConfigurer를 implements 함으로써, 보안과 관련된 추가적인 설정을 할 수 있습니다.
아마, Spring Security 강의나 다른 분들께서 만든 코드를 보신적이 있으신 분들은 WebSecurityConfigurerAdapter를 상속받아서 보안과 관련된 설정을 하는 것을 보셨을겁니다.
저도 강의를 볼 때, 대부분의 사람들이 SecurityConfig 파일이 WebSecurityConfigurerAdapter를 상속하는 형태로 코드를 작성하였습니다.
하지만, WebSecurityConfigurerAdapter는 이제 스프링에서 지원하지 않는다고합니다.
그래서 저는 이곳을 참조하여 SecurityFilterChain을 Bean으로 받는 방식을 활용하였습니다.
@EnableGlobalMethodSecurity(prePostEnabled = true)의 경우에는 추후에 사용하는 부분이 나왔을 때, 설명하도록 하겠습니다.
일단은 오늘은 프로젝트 틀을 잡고, SecurityConfig파일을 만드는 단계까지만 하고, 다음에는 JWT 관련 설정을 해보겠습니다.