개요

기존의 Nest.js에서 JAVA Spring으로 포팅을 진행하게 되면서, 인증 부분을 맡게 되었다.

Nest에서는 Passport라는 라이브러리를 통해서 OAuth를 간단하게 구현할 수 있었지만, Spring에서 인증-인가와 관련된 부분은 대부분 Spring Security를 통해서 관리되는 편이다.

Spring Security를 적용하기 전에, 우선적으로 Spring Security를 사용하지 않는 방식으로 인증-인가를 구현하고자 하였다.


시큐리티를 쓰지 않은 이유

우선, Spring Security의 러닝 커브가 높았고, 낯설은 부분(필터 체인과 같은)들이 너무나 많았다.

빠르게 구현해야하는 상황에서, 기존의 Guard를 이용한 AOP, 인터셉터와 같은 부분은 어느 정도 알고 있었기에 이와 유사한 방식으로 구현해보고자 하였다.

또한, 그 흐름을 이해하고 있지 않은 상태에서 추상화된 방법을 사용하면, 문제 상황이 발생하였을 때 통제하기가 어려울 것 같다는 의견으로 논의가 모였고, 이에 따라서 Spring AOP를 이용해서 구현하고자 하였다.

이 부분에 대해서 ‘바퀴를 만들고 있는 것 아닌가?’라는 의문점이 있었으나, 한번쯤 바퀴를 만들어 보는 것도 좋다고 생각했다.


관점 지향 프로그래밍(AOP)

AOP(관점 지향 프로그래밍, Aspect Oriented Programming)은 횡단 관심사를 공통되는 측면(Aspect)에 따라 모듈화하여, 코드가 중복되지 않고, 일관되게 로직을 적용할 수 있게끔 하는 프로그래밍 기법이다.

Untitled

횡단 관심사(Croscutting Concerns)란, 구분되는 다른 구현부에서 서로 공통되게 갖고 있는 부분을 말한다. 예로는 로깅, 인증/인가, 트랜잭션과 같은 부분들이 있다.

스프링에서는 Spring AOP, 더 구체적으로 사용하는 경우에는 Aspectj를 이용하여 AOP를 구현할 수 있다.

Spring AOP vs Aspectj

Spring AOP는 프록시 기반으로 AOP를 구현한다. Spring AOP는 대상 객체(Target)를 프록시 객체로 래핑하여 메서드 호출을 가로채고(Intercept) 부가적인 동작을 수행한다. 반면에 AspectJ는 바이트코드(.class) 조작을 사용하여 AOP를 구현한다. 이러한 방식의 차이로 인해, Spring AOP는 프록시를 사용해야하므로 런타임에서만 가능하지만, AspectJ는 컴파일 시점이나 로드 시점에 클래스 파일을 수정하여 AOP를 적용할 수 있다.

한 줄 요약: Aspectj가 더 상세하게 구현하기에 좋다. (참고 자료 : https://jiwondev.tistory.com/151)

우리의 경우에는 Aspectj를 이용하여 구현하였다.