Java/인증 및 인가, IAM

[Java] Spring Boot Security 이해하기 -1 : 2.7.x 버전 구조 및 파일 이해

adjh54 2022. 12. 18. 18:46
728x170
해당 글에서는 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
 

Spring Security without the WebSecurityConfigurerAdapter

<p>In Spring Security 5.7.0-M2 we <a href="https://github.com/spring-projects/spring-security/issues/10822">deprecated</a> the <code>WebSecurityConfigurerAdapter</code>, as we encourage users to move towards a component-based security configuration.</p> <p

spring.io

 

 

 

 

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

 

 

[참고] 다음 글에서는 이론을 바탕으로 실제 '환경설정' 하는 방법에 대해서 공유드립니다.
 

[Java] Spring Boot Security 이해하기 -2 : 5.7.x 버전 구현하기

해당 글에서는 이전에 Spring Security 5.7.x 버전에 대해 이해한 내용을 기반으로 실제 구현하는 방법에 대해서 공유합니다. [참고] Spring Boot Security를 적용하기 이전의 이해하기 위한 글을 참고하시

adjh54.tistory.com

 

 

[참고] 추가로 인증방식 중 'JWT를 이용한 인증방식'을 사용할 예정이면 이론과 환경설정 방법에 대해 공유드립니다.
 

[Java] Spring Boot Security 이해하기 -3: JWT(JSON Web Token) 이해하기

해당 글에서는 Spring Security의 인증을 위한 ‘JWT: JSON Web Token’를 이해하고 적용하기 위해 우선 이해를 목적으로 작성한 글입니다. 추후 적용을 위한 환경 설정 방법에 대해서 공유합니다. [참고]

adjh54.tistory.com

 

 

[Java] Spring Boot Security 이해하기 -4: JWT 환경 설정 및 구성 하기

해당 글에서는 Spring Boot Security내에 ‘인증’ 방식을 JWT를 이용하여서 사용자의 인증을 구성하는 환경 설정방법에 대해서 이해하기 위한 글입니다. [참고] 해당 글은 이전에 작성한 'JWT 이론'에

adjh54.tistory.com

 

 

 

 

 


오늘도 감사합니다 😄

 

 

 

 

그리드형