본문 바로가기
TIL

TIL - 24.01.18

by JHBang 2024. 1. 18.

AOP에 대해서

AOP는 핵심 로직과 부가 기능을 분히하고 모듈화한 프로그래밍 패러다임 중 하나다. 메소드 혹은 객체별로 부가적인 기능들을 모듈화해서 사용하는 것을 말한다. 중복된 코드를 하나의 모듈로 정리하는 방식이라고 할 수 있겠다.

 

여기서 부가기능은 로깅, 보안, 트랜잭션 등이 있다. 사실 이전 과제에서 @Transactional 어노테이션을 사용했었는데, 이게 AOP를 적용한 것이다.

 

만약 @Transactional 어노테이션을 사용하지 않았더라면 아래 코드를 트랜잭션을 거는 모든 코드에 추가했어야 했다.

class SomeService {

   fun doTransaction() {
			  val tx = em.getTransaction();
	      tx.begin();
        ... 
        // DB 관련 로직
	      ...
	      tx.commit();
	 
   }
}

 

AOP를 구현하는 방식에는 두가지가 있는데 Spring AOP를 이용하는것, 그리고 AspectJ를 이용하는 것이다. AspectJ가 속도는 훨씬 빠르지만 그만큼 구조화 하는데 난이도가 상당하다. 반면 Spring AOP는 속도가 느린 대신 매우 쉽게 AOP를 구현할 수 있도록 도와준다.

 

 

Spring Security 에 대하여

spring에서는 기본적으로 컨트롤러 이전에 필터 체인(Filter Chain)을 이용해서 다양한 역할을 수행한다. 이미지 변환부터 데이터압축, 암호화, 로깅 등등 도메인 로직 외의 부가적인 기능을 수행한다.

 

여기에 유저가 원하는 필터를 추가할 수 있도록 DelegatingFilterProxy를 제공하는데, 필터 체인 중간에 유저가 작성한 Bean을 ServletFilter에서 사용할 수 있게 해준다.

Spring Security는 여기서 DelegatingFilterProxy에 FilterChainProxy를 제공하여 인증과 관련된 필터를 체인에 추가할 수 있게 해준다.

 

 

위 그림이 spring security의 핵심 구조이다. Authentication 객체는 인증 정보를 담고 있으며 이 정보를 이용해 인증 여부를 확인하는게 핵심이다.

 

Principle은 유저의 식별자를 담고 있다. id 나 email 같은 정보를 말한다.

Credentials는 password 같은 중요한 정보를 담고 있다. 유출 방지를 위해 인증 후 삭제된다.

Authorities는 권한 정보이다. Role(역할)이나 Scope(수행 가능 범위) 를 담고있다.

 

Authentication 객체는 인터페이스다. 즉 구현체가 필요하다는 얘기다.

구현된 Authentication  객체를 담는 컨테이너가 SecurityContext이고, SecurityContextHolder는  SecurityContext를 관리하는 역할이다.

 

인증 필터를 통해 요청을 받고, 인증 여부를 판단한 뒤, 인증이 되면 SecurityContextHolder에 Authentication 객체를 할당한다.

 

인증 필터는 인증을 진행할 때 유저의 정보를 Authentication 객체에 담는데, 이를 필터에서 직접 처리하지 않고 다른 객체에게 인증 처리를 맡긴다.

아래는 이러한 역할을 하는 대표적인 요소들이다.

 

AuthenticationManager 

 - Authentication 객체를 받아 인증을 수행하는 역할이다.

 - 인터페이스 형태이므로 구현체가 필요하다

 

ProviderManager

 - AuthenticationManager 의 구현체이다.

 - ~~~Token 형태로 네이밍한다.

 

AuthenticationProvider

 - Provider에 주입될 수 있는 객체이다.

 - 여러 개의 AuthenticationProvider가 존재하며 서로 다른 종류의 인증을 사용한다.

ex)

password기반 로그인을 수행하는 EmailPasswordAuthenticationProvider, 

JWT에 대한 검증을 수행하는 JwtAuthenticationProvider, 

카카오톡 로그인을 수행하는 KakaoAuthenticationProvider 등등

 - ProviderManager는 AuthenticationProvider의 support(authentication: Authentication)  함수를 통해 어떤 Provider를 사용할지 결정한다.

 

 

 

 

'TIL' 카테고리의 다른 글

TIL - 24.01.23  (1) 2024.01.23
TIL - 24.01.17  (0) 2024.01.17
TIL - 24.01.15 (팀 프로젝트 회고)  (1) 2024.01.15
TIL - 24.01.11  (0) 2024.01.11
TIL - 24.01.09  (0) 2024.01.09