개발/백엔드

멀티캠퍼스 [현대 이지웰] Spring Security Login에 대해서 알아보자!

taecostudy76 2025. 10. 21. 22:11

 

Spring Security란?

인증, 권한 관리 그리고 데이터 보호 기능을 포함하여 웹 개발 과정에서 필수적인 사용자 관리 기능을 구현하는데

도움을 주는 Spring의 강력한 프레임워크입니다.

 

Spring Security를 사용하는 이유는 Spring Security는 개발 구조가 Spring이라는 프레임워크 안에서 활용하기 적합한

구조로 설계되어 있어, 보안 기능을 추가할 때 활용하기가 좋습니다.

 

 

코드와 함께 더 자세히 살펴보도록 하겠습니다.

 

 

 

@Entity는 이 클래스를 JPA 엔티티로 선언을 합니다.

JPA는 이 클래스를 보고 데이터베이스에 app_user 또는 appuser라는 이름의 테이블을 생성하거나 매핑을 진행합니다.

 

@SequenceGenerator는 @GeneratedValue에서 사용할 시퀀스 생성기를 상세히 정의합니다.

name = "MEMBER_SEQUENCE_GENERATOR": JPA가 이 시퀀스 생성기를 식별하기 위해 사용하는 이름입니다.

sequenceName = "MEMBER_SEQUENCE"는 데이터베이스에 실제로 생성되어 있는 (또는 생성할) 시퀀스 객체의 이름입니다.

 

@Id는 기본키를 임을 나타냅니다.

@GenerateValue는 기본 키의 값을 자동으로 생성할 방법을 설정합니다.

strategy = GenerationType.SEQUENCE는 키 생성 전력으로 데이터베이스 시퀀스를 사용하겠다고 설정을 합니다.

 

@Column(null = false, updateable = false)에서 nullable = false는 id 값은 NULL일 수 없다는 것을 알려줍니다.

updatable = false은 한번 생성된 id 값은 수정할 수 없다는 것을 알려줍니다.

 

unique = true는 username은 고유해야 한다는 것을 알려줍니다.

만약에 "user1" 이라는 아이디로 가입을 시도했을 때 DB에 이미 "user1"이 있다면, 데이터 베이스 레벨에서 에러가 발생합니다.

 

이 클래스는 데이터베이스 접근을 담당하는 레퍼지토리입니다.

여기서 인증과 인가에 직접 사용되는 사용자 정보를 다루게 됩니다.

상속받는 CrudRepository<AppUser, Long>는 기본적인 CRUD 메서드를 자동으로 생성하여 Bean으로 등록하게 됩니다.

그래서 개발자는 따로 메소드를 만들지 않고 findAll(), delete()등 기본적인 CRUD를 불러 사용할 수 있습니다.

 

@RepositoryRestResource(exported = false)

이 어노테이션은 Spring Data Rest 라이브러리 레포지토리 인터페이스를 스캔하여 자동으로 REST API 엔드포인트를

생성하는 편리한 기능을 제공합니다.

뒤에 false를 하여 자동으로 REST API를 노출하지 말라고 선언하는 것입니다.

 

그 이유는 현재 AppUser라는 중요한 정보를 관리하고 있어 다른 누군가가 직접 url로 접근을 하지 못하도록 하기 위함입니다.

 

그리고 밑에는 finByUsername(String name) 메서드를 따로 선언을 했습니다.

이 것은 기본 CRUD 이외에 개발자가 메서드를 만들면 JPA가 메소드 이름을 분석하여 자동으로 쿼리를 생성합니다.

 

 

이 클래스에서는 AppUserRepository에서 AppUser 정보를 가져와서 Spring Security가 이해할 수 있는

정보인 UserDetails로 변환하여 반환하는 것입니다.

 

implements UserDetailsService를 하여 UserDetailsService 인터페이스를 구현합니다.

이 인터페이스는 로그인을 시도할 때 loaduserByUsername 메소드를 호출해서 사용자 정보를 가져와야겠다고 인식하게 됩니다.

 

repository에서 사용자 정보를 가져오고, if문에서 사용자 정보가 있는지 없는지를 판단합니다.

만약 찾았을 경우 AppUser 타입으로 사용자 정보를 가져옵니다.

그리고 builder를 통해서 UserDetails를 만듭니다. 

bulder 클래스에 사용자 이름, 비밀번호, 권한을 builder 객체로 변환합니다.

 

 

SecurityConfig는 스프링 시큐리티를 설정하는 클래스입니다.

이 클래스는 Spring Security에 "우리 웹사이트의 보안을 어떻게 처리할지"에 대한 규칙을 알려줍니다.

@Configuration: Spring에게 이 클래스가 설정 파일임을 알립니다.

@EnableWebSecurity는 Spring Boot가 제공하는 기본 보안 설정을 비활성화하고,

이 클래스에 정의된 사용자 정의 보안 설정을 사용하겠다고 선언합니다.

 

 

여기서 중요하게 봐야 할 것은 configureGlobal(AuthenticationManagerBuilder auth) 메서드입니다.

Spring Security의 인증관리자를 설정하는 메서드입니다.

auth는 인증 관리자를 만들 수 있는 빌더 객체입니다.

 

로그인을 시도할 때 auth에게 userDetailsService를 호출합니다. 그러면 AuthenticationManager가 

loadUserByUsername를 호출하여 사용자 아이디를 받게 됩니다. 그리고 passwordEncoder를 통해 해시된

비밀번호를 받습니다.

전체적인 흐름을 보자면 

 

사용자가 로그인을 시도하게 되면 Controller에 도달하기 전에 Spring Security가 설치한 보안

AuthenticationFilter에 의해 먼저 가로채집니다.

 

그리고 인증 관리자인 AuthenticationManager에서 요청된 아이디와 비밀번호를 꺼냅니다.

우리가 SecurityConfig에서 설정한 AuthenticationManager에서 아이디와 비밀번호를 전달하여 인증을 요청합니다.

 

SecurityConfig에서 userDetailsService를 이용하여 DB에서 아이디를 조회하고,

BCryptPasswordEncoder를 이용하여 DB에 있는 비밀번호와 비교합니다.

그리고 UserDetailsServiceImpl은 UserDetails 객체를 만들어 AuthenticationManager 반환합니다.