woowacourse-teams / 2023-festa-go

🎪 페스타고, 대학 축제를 더욱 즐겁게!
71 stars 8 forks source link

[BE] 관리자 계정을 추가하기 위해, 인증 기능을 개편한다. #982

Closed seokjin8678 closed 4 months ago

seokjin8678 commented 4 months ago

✨ 세부 내용

특정 학교의 축제를 관리하는 관리자 계정을 추가하는 기능이 필요합니다.

이전부터 필요성을 얘기했듯이, 현재 저희가 학교의 모든 축제를 관리하는 것은 한계가 너무 큽니다. 😂

따라서 학교의 축제를 관리하는 별도의 관리자 계정을 만들어, 학교 측에서 축제를 관리하도록 해야 합니다.

해당 기능을 구현하려면 우선 기존 인증 기능을 개편해야 할 필요가 있습니다.

이유는 지금 인증으로 발급하는 JWT에는 단순히 권한과 권한에 해당하는 식별자(멤버,어드민)을 담는데, 관리자 계정이 추가된다면 똑같이 권한과 식별자가 담겨있는 토큰이 발급됩니다.

하지만 관리자는 자기 학교의 축제만을 관리할 수 있기에, 자기 학교가 아닌 축제는 수정할 권한이 없어야 합니다.

지금의 JWT에는 권한과 식별자만 담겨있기에, 요청으로 들어오는 관리자 토큰이 어떤 학교를 수정할 권한이 있는지 확인할 수 없습니다.

이 정보를 가지고 권한을 확인하려면, DB를 조회하여 매번 해당 관리자의 식별자가 해당 축제에 관한 관리 권한이 있는지를 확인하기 위한 쿼리가 발생합니다.

이 쿼리를 없애기 위해서는, JWT에 수정할 권한이 있는 학교의 식별자를 담고, 서버에서 해당 토큰을 파싱에 성공한다면, 해당 관리자 계정에 담긴 학교 식별자를 권한이 있는 것으로 판단하여, DB에 쿼리를 날릴 필요 없이 그대로 사용하면 됩니다.

하지만, 학교의 식별자가 담긴 토큰과 기존 식별자만 있는 회원, 어드민 토큰의 형식이 다르기 때문에 이를 구현하기가 불가능합니다. (토큰 발급은 어떻게 하더라도, 토큰을 다시 추출하는 과정에서 토큰의 권한에 따라 다른 객체로 추출할 수 있어야 함)

또한 개편해야 하는 이유가 하나 더 있는 것이, 어드민 JWT가 일반 회원의 JWT와 동일한 형식을 가지고 있습니다. image

명확한 구분을 위해서라면, adminId 또는 id라는 이름의 key를 사용해야 합니다. (OpenID 토큰과 비슷하게 Subject에 담는 것도 좋아 보입니다.)

만약 회원 JWT에 새로운 필드(이하 클레임)가 추가된다면, 이를 의존하는 어드민 JWT 또한 영향을 받게 됩니다.

따라서 JWT 페이로드의 권한에 따른 특수한 클레임이 있을 수 있는 것을 고려하여, 권한마다 별도의 Parser를 만들어 사용해야 합니다.

또한 Controller에서 사용하는 ArgumentResolver로 받는 타입 또한 단일 Long 인스턴스를 받는 게 아닌, POJO 형식의 DTO를 받을 수 있도록 변경해야 합니다.

최종으로, 이러한 인증 기능을 개편한 뒤, Manager라는 권한과 도메인을 추가하여 관리자 계정을 위한 작업을 진행해야 합니다.

⏰ 예상 소요 시간

4시간