본문 바로가기

패스트캠퍼스/100% 환급 챌린지_2

패스트캠퍼스 환급챌린지 15일차 : Netplix 구독형 멤버십 프로젝트로 배우는 Spring Security 강의 후기

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://abit.ly/lisbva

 

 

안녕하세요 :)

오늘은 챌린지 15일차로, 11분짜리 클립 한 개 빠르게 수강하고 자야겠어요!

 

오늘 배울 내용은,

Part A. 로그인, 로그아웃, 회원가입으로 배워보는 스프링 시큐리티 기초

Ch 4. PasswordEncoder 와 암호 처리

"04. AOP 를 활용하여 비밀번호 암호화하기 - 1" 입니다.


 

암호화를 하려면 어떻게 해야 할까? HelloRequestBody 로 평문 비밀번호를 입력 받은 다음 직접 암호화 로직을 실행시키면 된다. 하지만 단점이 있는데, 암호화가 필요한 시점에 매번 로직을 수행해야 한다는 점이다.

AOP의 개념을 활용해보자.
1. 암호화하고 싶은 필드에 커스텀 어노테이션을 부여한다.
2. API 요청이 들어온 시점을 AOP 를 통해 파악한다.

- Spring AOP 라이브러리 활용 필요하다.
3. Java reflection 을 활용하여 해당 어노테이션이 부여된 필드를 파악한다.
- Apache Commons Lang3 라이브러리 활용 필요하다(FieldUtils 클래스 활용).
4. 암호화 수행

AOP 와 Field 에 대한 reflection 을 수행하기 위해 아래 2개의 의존성 추가해야 한다.
- implementation 'org.springframework.boot:spring-boot-starter-aop'
- implementation 'org.apache.commons:commons- lang3'

CustomEncryption 이름으로 필드 어노테이션 생성하는 방법은 다음과 같다.
- annotation 패키지를 생성하고 하위에 어노테이션 생성한다.
- interface 로 생성하고 @를 붙여 어노테이션으로 생성한다.
1. ElementType.FIELD 를 통해 필드에 부여할 어노테이션임을 의미한다.
2. RetentionPolicy.RUNTIME 을 통해 런타임 시점에 동작함을 의미한다.

API 요청이 들어온 시점을 파악하기 위해 AOP 를 활용하는 방법은, controller 패키지 아래 전체 메소드가 수행되는 시점에 Around 유형으로 Aspect 가 동작하도록 설정하면 된다.

Field Reflection 과 암호화 로직에 대해 살펴보면 다음과 같다. ProceedingJoinPoint 의 getArgs() 를 통해 요청 객체에 접근하고, Object[] 형태로 되어 있기 때문에 Arrays.stream 을 통해 stream() 으로 변경한다. 그리고 각 argument 마다 fieldEncryption (암호화 로직) 메소드를 수행한 뒤, object 값이 empty 이면 로직을 더 이상 수행하지 않는다.


apache.commons. lang3 라이브러리의 Fieldutils 활용하고, getAllFieldsList 를 통해 각 데이터 필드에 접근한다. 참고로, final 이나 static 필드는 제외한다. 그리고 나머지 각 필드에 대해서는 CustomEncryption어노테이션이 부여되어 있는지 확인한 뒤, 어노테이션이 부여되어 있지 않다면 제외한다. String 형태가 아니라면 제외 한다(암호는 문자열이기 때문에). EncryptService 의 encrypt 메소드를 통해 암호화 수행한 뒤, 필드의 값을 암호화된 값으로 업데이트 한다.

테스트 코드 작성은 @Mock 어노테이션 사용을 위해 MockitoExtension 활용한다.
HelloRequestBody 에 "password" 값을 설정한 뒤, encrypt 메소드가 호출되었을 때 "encrypted" 값이 반환되도록 설정한다. 그리고 password 필드의 값은 암호화가수행된 결과인 "encrypted" 가 되도록 테스트 수행하면 된다는 것을 알 수 있다.