• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

인터셉터 질문입니다.

23.05.16 18:16 작성 조회수 330

0

인터셉터를 듣던중 궁금증이 생겨 질문남깁니다.

인터셉터를 사용해서 사용자의 로그인 인증이 가능했습니다.

만약, 특정 API를 로그인, 비로그인 사용자가 모두 접속이 가능하고, 로그인 사용자일 시 추가 작업이 발생하는 경우에 인터셉터를 사용하여 해결합니까? 다른 방법이 있다면 어떤 것이 있나요?

 

예를 들어 특정 숙소의 신청 상태의 관해서, 비 로그인 시 추가 작업 없음, 로그인 사용자 시 사용자 신청 상태를 판별하는 추가 작업 필요.

답변 1

답변을 작성해보세요.

1

y2gcoder님의 프로필

y2gcoder

2023.05.17

안녕하세요, rnqhstlr2297 님. 공식 서포터즈 y2gcoder 입니다.

만약, 특정 API를 로그인, 비로그인 사용자가 모두 접속이 가능하고, 로그인 사용자일 시 추가 작업이 발생하는 경우에 인터셉터를 사용하여 해결합니까? 다른 방법이 있다면 어떤 것이 있나요?

 

예를 들어 특정 숙소의 신청 상태의 관해서, 비 로그인 시 추가 작업 없음, 로그인 사용자 시 사용자 신청 상태를 판별하는 추가 작업 필요.

개인적으로 해당 기능은 비즈니스 로직과 강하게 연관되어 있다고 생각합니다. 로그인 사용자에게는 추가적인 비즈니스 로직을 적용해야 한다면 저는 서비스 단(혹은 DDD라면 도메인 레이어)에서 해당 기능을 추가해줄 것 같습니다 :) 개인적인 의견이고 정답은 아닙니다!


감사합니다.

답변 감사합니다 :)

추가 로직은 저도 비지니스 로직이 적합하다고 생각합니다.

특정 API에 대해서 비로그인, 로그인 사용자 모두 접근이 가능하고 로그인 사용자 접근 시 인증(세션, 토큰 등)절차가 이루어져야한다면 이를 인터셉터로 해결하는것이 가장 바람직합니까?

y2gcoder님의 프로필

y2gcoder

2023.05.17

저는 인터셉터를 웹 계층과 관련하여 공통적으로 처리해줘야 할 사항이 있을 때 사용합니다. 말씀하신 것처럼 인증 혹은 인가가 필요한 부분에 사용하기 적절하다고 생각합니다.

개인적인 관점에서 특정 API에 대해 모든 사용자가 접근 가능하고 인증 사용자에게 추가적인 기능이 필요하다면, 인터셉터에서 해줘야하는 기능이 아니라 비즈니스적인 기능이라고 생각하기 때문에 위와 같이 답변을 드렸습니다.

이는 개인적인 의견이기 때문에, rnqhstlr2297님께서 위의 기능을 인증 인터셉터에서 해줘야 할 일인지 스스로 판단해보시고 판단 결과에 따라 개발해보시는 것이 바람직하다고 생각합니다.

튜터님 정성스러운 댓글 감사합니다.!! 하나만 더 궁금한 점이 있습니다.

만약 서비스의 인증 시스템이 스프링 시큐리티 & JWT 으로 이루어진 시스템에서, 기본적인 인증이 필요한 API는 시큐리티 인증 필터에서 JWT 토큰 유효성 검사 및 DB 검사가 이루어집니다.

문제 상황: 특정 API에서 로그인 한 사용자의 경우 신청 상태를 파악하는 추가 기능이 필요합니다. 그리고 이 API는 로그인, 비로그인 사용자가 모두 접근할 수 있게 됩니다.

나의 생각: 신청 상태를 파악하는 추가 기능은 비지니스 로직에서 구현되는것이 맞다고 생각하는데, 제가 생각하기에 이 API에 대해서 모든 사용자가 접근 가능 해야하므로 시큐리티 필터의 인증/인가 검증을 하지 않아야 한다고 생각합니다. 그러면 만약 로그인 사용자일 경우 JWT 토큰 내에서 필요한 사용자 정보를 파싱하기 위한 작업이 필요하다고 생각하는데, 단순 파싱이 아닌 JWT 토큰 유효성 검사, 만료 기간 검사 등 필수적인 절차들이 필요하다고 생각합니다. 이러한 기능들을 인터셉터에 구현하려고 하는데, 이미 시큐리티 인증 기능의 필터에 해당 기능들이 구현되어있어 코드의 중복이 발생하는거 같고 좋지 못한 코드가 되는거 같다고 생각이 듭니다.

그래서 시큐리티의 익명 사용자를 사용해서 해결하려고 해보는데, 이도 해결 방법이 되지 않는거 같습니다. ㅠㅠ 혹시 좋은 방법이 있으시면 조언 부탁드립니다.

 

y2gcoder님의 프로필

y2gcoder

2023.05.17

부족한 제 생각을 자꾸 강요하는 모양새가 되는 것 같아 조심스럽습니다.

제가 rnqhstlr2297님이 현재 진행하고 계신 프로젝트의 정확한 요구사항을 모르는 상태에서 현재 API에 대한 기능을 정리해봤을 때,

  • 해당 API에는 로그인한 사용자(토큰이 있음)/비로그인한 사용자(토큰이 없음) 모두 이용할 수 있음.

  • 로그인한 사용자가 해당 API에 접근할 때 추가적으로 비즈니스 로직을 타서 어떤 정보를 추가적으로 제공해줘야 하는 것으로 보임.

  • 해당 정보가 중요하기 때문에 로그인한 사용자는 토큰에서 단순히 유저에 대한 식별 정보를 파싱해오는 것뿐만 아니라 토큰에 대한 검증 등의 인증 절차가 필요함

이런 상황이라면 사실 저는 두 가지 방법을 사용할 것 같습니다.

  • 로그인한 사용자와 비로그인한 사용자를 위해 API 엔드포인트를 아예 두 개로 분리하고 로그인한 사용자는 인증 절차를 거치도록 구현하거나,

  • 인증이 꼭 필요하고, API 엔드포인트를 나눌 수 없다면 중복이 발생하기는 하나 비즈니스 로직에 인증 절차를 두거나

위의 두 가지 중에 하나를 택해서 개발해볼 것 같습니다. 요구사항과 제약조건에 따라 다르기는 하나 둘 다 가능한 상황이라면 저는 1번째를 선호할 것 같습니다. 궁극적으로는 같은 기능이라고는 하나 로그인한 사용자에게는 추가적인 비즈니스적인 처리가 필요하고, 이 비즈니스적인 처리가 중요하다면 아예 엔드포인트를 나누는 것도 좋다고 생각합니다.

제 짧은 생각이었으니 가볍게 참고만 해주시면 감사하겠습니다 :)

감사합니다. 튜터 님!!!! 결정에 많은 도움이 되었습니다!!! :)

y2gcoder님의 프로필

y2gcoder

2023.05.18

파이팅입니다!