HandlerInterceptor 적용기

일상 회고록·2024년 1월 29일
0
post-thumbnail
post-custom-banner

안녕하세요!

오늘 포스팅할 내용은 프로젝트를 진행하다보면 꼭 포함되는 ‘사용자 권한’에 대한 회고입니다.

사용자 인가(Authorization) 권한을 다루는 방법은 여러가지가 있습니다.

그 중 제가 어떠한 이유와 요구사항으로 특정 방법을 택하게 되었는지 알아보겠습니다.

그럼 시작하겠습니다!

1. 이슈

브릿지 프로젝트에서 회원가입 및 로그인 개발은 제가 담당했습니다.

해당 기능을 구현하며 참 많은 고민을 했는데, 가장 큰 고민은 기능 별 사용자 권한을 검사하는 이슈였습니다.

즉, 로그인 한 회원과 회원가입을 하지 않은 비회원의 경우 각각 접근할 수 있는 기능 목록이 달랐습니다.

1-1. 요구사항

브릿지 프로젝트의 경우 아래와 같은 요구사항이 있었습니다.

  • 자체 회원가입과 로그인은 제외
  • 비회원은 특정 기능 API 권한 없음
  • Spring Security 적용 안함
  • 토큰으로 인가 권한 검사

고민의 시작은 자체 회원가입 기능이 없다는 것이었는데요

만약 자체 회원가입과 로그인 기능이 있는 경우, Spring Security를 사용해 Filter로 사용자별 권한 검사를 진행할 계획이었습니다.

사실 모든 사람들이 Spring Security를 사용하는 것은 아니기 때문에, 다른 대안이 반드시 있을 것이라고 생각했습니다.

권한과 관련해서 여러가지를 공부하고, 알아본 결과 Interceptor를 알게되었고, 쉽게 적용할 수 있을 것 같아서 해당 방식을 쓰기로 결정했습니다.

그렇다면 HandlerInterceptor에 대해 한 번 알아볼까요?

2. HandlerInterceptor

먼저 인터셉터란 다수의 컨트롤러에 동일한 기능을 제공하지 위해 컨트롤러 로직이 실행되기 전에 실행됩니다.

인터셉터의 호출 흐름을 살펴보자면 아래와 같습니다.


스프링 인터셉터의 동작은 크게 세단계로 구분됩니다.

  • 컨트롤러 실행 전
  • 컨트롤러 실행 후, 뷰 실행 전
  • 뷰 실행 후

스프링 인터셉터를 사용하기 위해서 HandlerInterceptor인터페이스를 구현해야합니다.

HandlerInterceptor 공식 문서


이때 위의 세단계와 각각 매칭되는 구현 메소드는 아래와 같습니다
  • preHandle( ) → 컨트롤러 실행 전
  • postHandle( ) → 컨트롤러 실행 후, 뷰 실행 전
  • afterCompletion( ) → 뷰 실행 후

즉, API 요청이 서버로 도착하면 컨트롤러 실행 전 작성한 preHandle( ) 메소드가 실행됩니다.

이후 뷰로 넘어가기 전 postHandle( ) 메소드가 실행되고, 최종적으로 뷰 실행 후 afterCompletion() 메소드가 실행됩니다.

2-1. preHandle( )

preHandle() 메소드는 컨트롤러 호출 전에 실행되는 메소드로 반환 타입은 boolean 입니다.

따라서 만약 false를 반환하게 된다면 컨트롤러를 호출하지 않게 됩니다.

2-2. postHandle( )

postHandle() 메소드는 컨트롤러가 정상적으로 호출된 후에 Spring MVC의 Dispatcher Servlet이 화면을 처리하기 전에 실행되는 메소드입니다.

2-3. afterCompletion( )

afterCompletion() 메소드는 Dispatcher Servlet의 화면 처리가 완료된 이 후 실행됩니다.

컨트롤러 실행과정에서 예외가 발생한 경우, 해당 예외가 afterCompletion() 메소드의 4번째 파라미터로 전달되어, 로그로 남기는 등 후처리를 위해 사용될 수 있습니다.

3. 적용

실제로 브릿지 프로젝트에 적용해보겠습니다.

저는 세가지 단계 중 컨트롤러 전 토큰으로 인가 권한 검사가 필요했기 때문에 preHandle() 메소드만 구현했습니다.

먼저 아래와 같이 HandlerInterceptor 를 상속받는 클래스를 만들고, preHandle() 를 오버라이드합니다.


이후 토큰을 통해 인가 권한 검사 구현체를 작성해줍니다


마지막으로 작성한 인터셉터를 적용할 수 있도록 Spring MVC에 등록해줍니다.


짜잔 이렇게해서 추가한 API 경로에만 직접 작성한 인터셉터를 적용함으로써 기능 별 사용자 인가 권한 검사가 가능해졌습니다!


심심한 회고 읽어주셔서 감사합니다!



References

Spring HandlerInterceptor를 활용하여 컨트롤러 중복 코드 제거하기

[Spring] HandlerInterceptor와 이를 활용한 로그인 처리

profile
하고 싶은 것들이 많은 개발자입니다
post-custom-banner

0개의 댓글