반응형
해당 글에서는 Spring Boot 기반의 Spring Security Framework를 적용하여 로그인의 API를 구성하는 방법에 대해서 공유합니다.
1) 개발환경
💡 Spring Security 개발 환경을 구성하기 위해 사용한 개발환경입니다.
개발 환경 | 버전 | 비고 |
java | 1.8 | |
Spring Boot | 2.7.5 | |
Spring Boot Starter Security | 2.7.5 | Spring Framework : 5.7.4 |
jsonwebtoken: jjwt | 0.9.1 | |
빌드관리도구 | Gradle 7.5 | |
개발 툴 | IntelliJ IDEA 2022.3 |
2) Spring Security
💡 Spring Security
- 애플리케이션 내의 보안 중 사용자에 대한 ‘인증’과 ‘인가’에 대한 처리를 담당하는 프레임워크를 의미합니다.
💡 Spring Security의 인증(Authentication)
- 사용자는 자신을 입증할 수 있는 ‘정보’를 시스템에 제공하며, 시스템은 사용자에 대한 정보를 ‘검증’하여 시스템을 이용할 수 있는 사용자 인지에 대해 확인을 하는 과정을 의미합니다.
💡 Spring Security의 인가(Authorization)
- 애플리케이션에서 보호된 자원(메서드 접근 혹은 요청에 대한 자원)에 대해서 접근을 허가하거나 거부하는 기능을 의미합니다.
💡 [참고] Spring Security 5.7.x 버전에 대한 이슈 사항
💡 ‘WebSecurityConfigurerAdapter’ Deprecated
- Spring Framework Security 5.6.x 버전 이하에서는 WebSecurityConfig 클래스에서 WebSecurityConfigurerAdapter를 상속받아서 사용하였으나 5.7.x 버전 이상부터는 컴포넌트 기반의 Configuration을 구성하는 것을 권장으로 하기에 WebSecurityConfigurerAdapter는 Deprecated 되었습니다.
💡 해당 환경에서는 5.7.4 버전을 이용하기에 ‘WebSecurityConfigurerAdapter’를 사용하지 않고 구성합니다.
[참고] Spring Security without the WebSecurityConfigurerAdapter
3) Spring Security의 구성 및 흐름도
1. 전체 구성 흐름도
💡 구성한 Spring Security 아키텍처입니다.
💡 추후에 구성할 파일들에 대한 스크린샷입니다.
2. 상세 설명
[ 알고 가기 ]
💡 @Configuration란 무엇인가?
- 해당 어노테이션을 선언하여 해당 클래스가 Spring Container에 관리가 되는 설정 클래스임을 선언하며 Bean을 구성할 클래스임을 알리는 어노테이션을 의미합니다.
💡 @Bean이란 무엇인가?
- 스프링 컨테이너(Spring Container)에 의해 관리되는 메서드를 의미하며 수동으로 해당 어노테이션을 통하여 주입을 합니다.
💡 @Bean을 사용하는 경우
- 개발자가 직접 제어가 불가능한 라이브러리를 활용할 때
- 애플리케이션 전범위적으로 사용되는 클래스를 등록할 때
- 다형성을 활용하여 여러 구현체를 등록해주어야 할 때
1. WebSecurityConfig.java
💡 Spring Security의 환경설정을 구성하기 위한 클래스입니다.
💡 웹 서비스가 로드 될때 Spring Container에 의해 관리가 되는 클래스이며 사용자에 대한 ‘인증’과 ‘인가’에 대한 구성을 Bean 메서드로 주입을 한다.
2. [WebSecurityConfig] - WebSecurityCustomizer
💡 정적 자원(Resource)에 대해서 인증된 사용자가 정적 자원에 대한 접근에 대해 ‘인가’에 대한 설정을 담당하는 메서드이다.
3. [WebSecurityConfig] - SecurityFilterChain
💡 해당 메서드 내에서 CustomAuthenticationFilter 호출합니다.
💡 HTTP에 대해서 ‘인증’과 ‘인가’를 담당하는 메서드이며 필터를 통해 인증 방식과 인증 절차에 대해서 등록하며 설정을 담당하는 메서드이다.
4. [WebSecurityConfig] - CustomAuthenticationFilter => CustomAuthenticationFilter.java
💡 해당 메서드 내에서 AuthenticationManager를 호출하여 전달합니다.
💡 인증 성공 시 CustomAuthSuccessHandler를 호출하고, 실패 시 CustomAuthFailureHandler를 호출합니다.
💡 커스텀을 수행한 '인증' 필터로 접근 URL, 데이터 전달 방식(form) 등 인증 과정 및 인증 후 처리에 대한 설정을 구성하는 메서드입니다.
💡 최종 인증이 완료되면 사용자 아이디와 비밀번호 기반으로 토큰을 발급합니다.
5. [WebSecurityConfig] - AuthenticationManager
💡 해당 메서드 내에서 실제적인 구현은 CustomAuthenticationProvider에서 진행합니다.
💡 인증에 대한 인터페이스로 수행을 합니다. 구현체는 CustomAuthenticationProvider로 전가합니다.
6. [WebSecurityConfig] - CustomAuthenticationProvider => CustomAuthenticationProvider.java
💡 전달받은 사용자의 아이디와 비밀번호를 기반으로 비즈니스 로직을 처리하여 사용자의 ‘인증’에 대해서 검증을 수행하는 클래스입니다.
💡 CustomAuthenticationFilter로 부터 생성한 토큰을 통하여 ‘UserDetailsService’를 통해 데이터베이스에서 정보를 조회합니다.
7. [WebSecurityConfig] - CustomAuthSuccessHandler
💡 사용자의 ‘인증’에 대해 성공하였을 경우 수행되는 Handler로 성공에 대한 사용자에게 반환값을 구성하여 전달하는 클래스입니다.
8. [WebSecurityConfig] - CustomAuthFailureHandler
💡 사용자의 ‘인증’에 대해 실패하였을 경우 수행되는 Handler로 실패에 대한 사용자에게 반환값을 구성하여 전달하는 클래스입니다.
9. [WebSecurityConfig] - BCryptPasswordEncoder
💡 비밀번호를 암호화하기 위한 BCrypt 인코딩을 통하여 비밀번호에 대한 암호화를 수행합니다.
3. 파일 종합 설명
💡 Spring Security를 구성하는데 사용하는 파일 및 메서드에 대한 종합 설명입니다.
파일/메서드 명 | 분류 | 분류 | 설명 |
WebSecurityConfig | 인증, 인가 환경 클래스 | @Configuration | - Spring Security의 환경설정을 구성하기 위한 클래스입니다. - 웹 서비스가 로드 될때 Spring Container에 의해 관리가 되는 클래스이며 사용자에 대한 ‘인증’과 ‘인가’에 대한 구성을 Bean 메서드로 주입을 한다. |
WebSecurityCustomizer | 리소스 인가 | @Bean | - 정적 자원(Resource)에 대해서 인증된 사용자가 정적 자원에 대한 접근에 대해 ‘인가’에 대한 설정을 담당하는 메서드이다. |
SecurityFilterChain | HTTP 인증, 인가 | @Bean | - HTTP에 대해서 ‘인증’과 ‘인가’를 담당하는 메서드이며 필터를 통해 인증 방식과 인증 절차에 대해서 등록하며 설정을 담당하는 메서드이다. |
CustomAuthenticationFilter | 인증 필터 | @Bean | - 커스텀을 수행한 '인증' 필터로 접근 URL, 데이터 전달방식(form) 등 인증 과정 및 인증 후 처리에 대한 설정을 구성하는 메서드입니다. - 최종 인증이 완료되면 사용자 아이디와 비밀번호 기반으로 토큰을 발급합니다. |
AuthenticationManager | 인증에 대한 인터페이스 | @Bean / interface |
- 인증에 대한 환경설정을 수행합니다 |
CustomAuthenticationProvider | 인증에 대한 구현체 | @Bean / implements |
- 전달받은 사용자의 아이디와 비밀번호를 기반으로 비즈니스 로직을 처리하여 사용자의 ‘인증’에 대해서 검증을 수행하는 클래스입니다. - CustomAuthenticationFilter로 부터 생성한 토큰을 통하여 ‘UserDetailsService’를 통해 데이터베이스 내에서 정보를 조회합니다. |
CustomAuthSuccessHandler | 인증 필터 성공 | @Bean | - 사용자의 ‘인증’에 대해 성공하였을 경우 수행되는 Handler로 성공에 대한 사용자에게 반환값을 구성하여 전달하는 클래스입니다. |
CustomAuthFailureHandler | 인증 필터 실패 | @Bean | - 사용자의 ‘인증’에 대해 실패하였을 경우 수행되는 Handler로 실패에 대한 사용자에게 반환값을 구성하여 전달하는 클래스입니다. |
BCryptPasswordEncoder | 비밀번호 갱신 | - 비밀번호를 암호화하기 위한 BCrypt 인코딩을 통하여 비밀번호에 대한 암호화를 수행합니다. | |
UserDetailsService | 사용자 조회 인터페이스 | interface | - Spring Security 서비스를 사용하기 위해 구현된 인터페이스를 의미합니다. 실제 구현체를 생성하여 사용합니다 |
UserDetailsServiceImpl | 사용자 조회 구현체 | implement | - Spring Security의 ‘UserDetailService’의 구현체로 사용자의 정보에 대해서 ‘인증’을 수행하는 비즈니스 로직을 구성한다. |
UserDetails | 사용자 조회 객체 | DTO | - 로그인에 사용되는 객체에 대해서 관리하는 클래스이다. |
UserService | 비즈니스 인터페이스 | interface | - 사용자 정보를 불러오기 위한 인터페이스 |
UserServiceImpl | 비즈니스 구현체 | implements | - 사용자 정보를 불러오기 위한 구현체 |
UserMapper | 비즈니스 SQL Mapper | interface | - 사용자 정보를 불러오기 위한 SQL Mapper |
UserDto | 비즈니스 객체 | DTO | - 사용자 정보를 가지고 있는 객체 |
UserMapper.xml | 비즈니스 SQL 문 | xml 파일 | - 사용자 정보를 가져오기 위한 Query |
[참고] 다음 글에서는 이론을 바탕으로 실제 '환경설정' 하는 방법에 대해서 공유드립니다.
[참고] 추가로 인증방식 중 'JWT를 이용한 인증방식'을 사용할 예정이면 이론과 환경설정 방법에 대해 공유드립니다.
오늘도 감사합니다 😄
반응형
'Java > Spring Boot' 카테고리의 다른 글
[Java] Spring Boot Security 이해하기 -3: JWT(JSON Web Token) 이해하기 (0) | 2022.12.21 |
---|---|
[Java] Spring Boot Security 이해하기 -2 : Spring Boot 2.x 버전 환경 구성하기 (0) | 2022.12.18 |
[Java] Business Exception 이해하고 구성하기 : Service Exception (0) | 2022.12.10 |
[Java] Global Exception 이해하고 구성하기 : Controller Exception (5) | 2022.11.13 |
[Java/Library] Spring Boot Validation 이해하기 : 데이터 유효성 검증 (4) | 2022.11.08 |