Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#510 [feat] 인가 로직 개편 작업 #513

Merged
merged 15 commits into from
Sep 18, 2024
Merged

#510 [feat] 인가 로직 개편 작업 #513

merged 15 commits into from
Sep 18, 2024

Conversation

sohyundoh
Copy link
Member

@sohyundoh sohyundoh commented Sep 14, 2024

✒️ 관련 이슈번호

Key Changes 🔑

  1. 기존에 얘기하였던 인가 로직을 개편하기 위한 작업을 진행했습니다!
    컨트롤러 메서드 상단의 어노테이션을 통해 인가를 구분하고 Interceptor에서 처리하는 방식으로 진행했습니다! 아래가 상세이니 읽어주시면 감사하겠습니다🙇🏻‍♀️

기존에는 글모임장인 경우, 글모임의 단순 회원인 경우, 이 둘의 인증이 필요하지 않은 경우, 토큰이 필요하지 않은 경우 모두 잘 구분이 되지 않는 상황이었는데 컨트롤러에서 이를 깔끔하게 구분할 수 있게 유도하면 좋을 것 같아 어노테이션을 도입했습니다! (인터셉터를 여러개 정의하고 WebConfig에서 나누는 것 보다는 어노테이션을 통해 인터셉터에서 나누는 것이 확장성 측면에서 좋은 것 같습니다! WebConfig에서 나눌 경우 API 엔드포인트가 변경되면 interceptor도 함께 바꿔줘야하기 때문)

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface UserAuthAnnotation {
UserAuthenticationType value() default UserAuthenticationType.USER;
}

  • 글모임장의 인증이 필요한 경우에는 OWNER을 value로 도입하고, 글모임 회원의 인증이 필요한 경우에는 WRITER_NAME을 value로 설정하면 됩니다!
  1. 플로우
  • 토큰을 발급할 때 글모임에 대한 유저 권한이 담겨있는 Map을 함께 claim 에 담아 발급
    • 해당 부분에 대해 API 변동이 있습니다 ( 글모임을 새로 생성하거나, 글모임에 가입할 경우 토큰을 업데이트 해야하기 때문입니다)
  • Interceptor에서 모든 API에 대해 어노테이션이 있는지 확인함
  • 어노테이션이 있다면 어노테이션 내부 value 확인을 통해 인증해야하는 방식을 정의
  • 토큰에서 받아온 유저 권한이 담겨있는 Map을 통해 OWNER나 WRITER_NAMER에 해당하는 인증을 진행

To Reviewers 📢

  • 초기 PR이므로 테스트 하면서 변경 사항 생기면 도입하겠습니다!
  • 예시를 위해 2개의 API만 작업했습니다! 지금까지 변경사항 어푸 되면 전체적으로 인증 방식 바꾸겠습니다!
  • 이후 글모임 가입 API에서는 5개 초과하는지 확인하는 부분도 Interceptor에서 받아온 Map 크기 기반으로 확인해도 좋을 것 같습니다!
  • 글모임을 탈퇴할 & 탈퇴시킬 경우에 토큰을 새로 발급해야 하는 이슈가 있을 것 같습니다!
  • 이는 글모임을 탈퇴시킨 사용자를 대상으로 이후 첫번째 요청에 토큰을 검사하여 토큰을 재발급해주어도 좋을 것 같습니다!

토큰이 <글모임 ID, 권한>을 Map으로 가지고 있을 수 있게 사전 작업을 진행했습니다. Test가 계속해서 통과하게 수정했습니다.
@sohyundoh sohyundoh added the high label Sep 14, 2024
@sohyundoh sohyundoh self-assigned this Sep 14, 2024
Copy link
Contributor

@parkheeddong parkheeddong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM .. 👍 기존에 비해서 코드 중복도 사라지고 확장성에도 좋고 훨씬 발전된 방식이라 좋은 것 같습니다! 작업 하느라 고생하셨습니다!
그런데 궁금한 부분이 있는데 글모임 탈퇴 시 토큰 업데이트에 대해서 "글모임을 탈퇴시킨 사용자를 대상으로 이후 첫번째 요청에 토큰을 검사하여 토큰을 재발급해주어도 좋을 것 같습니다!" 라고 하셨는데, 탈퇴 이후 첫번째 요청인지는 어떻게 판단하나요?? 탈퇴 즉시 토큰을 재발급하는 것과 어떤 차이가 있는지 궁금합니다!

Comment on lines 125 to 134
public Map<Long, MoimRole> getJoinedRoleFromUserId(final Long userId) {
return writerNameRepository.findAllByWriterId(userId).stream().collect(
Collectors.toMap(writerName -> writerName.getMoim().getId(), this::getWriterNameMoimRole)
);
}

private MoimRole getWriterNameMoimRole(final WriterName writerName) {
return writerName.getMoim().getOwner().equals(writerName) ? MoimRole.OWNER : MoimRole.WRITER;
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P5) 이 부분에서 OWNER이 아니면 WRITER라고 본다면 비회원의 경우 예외가 발생할 수 있지 않을까요?? MOIM ROLE에 NON_MEMBER를 추가하는 것은 어떤지 궁금합니다!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 헷갈려서 질문 드립니다!! 해당 메서드는 userId기반으로 writername을 찾고, 이를 기반으로 토큰을 발급하기 위한 메서드 입니다! 그래서, userId로 writerName을 찾고 해당 필명프로필이 모임장인지, 모임장이 아닌지 확인하는 플로우인데요! 그래서 비회원인 경우는 필명 프로필 조회에서 조회가 되지 않을 것 같은데, 혹시 이 플로우에서 비회원인 경우를 정의해놓지 않아 예외가 발생할 수 있을까요?? MoimRole에 비회원인 경우는 USER로 판단하는 변수가 존재하기는 합니다..!!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

생각해보니 일단 필명이 존재하는 이상은 모임장이거나/ 모임장이 아닌 필명이거나 두가지의 경우의 수밖에 없어서 예외가 발생할 경우가 없을것같네요! 헷갈렸는데 감사합니다😅

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

별도로 권한 확인해야 하는 작업이 사라지니.. 너무 깔끔하고 좋네요..

@sohyundoh
Copy link
Member Author

@parkheeddong 위에 질문 주신 회원의 글모임 탈퇴시 플로우에 대한 의견 드립니다! 현재 글모임 회원 본인이 모임을 탈퇴하는 플로우는 없고, 탈퇴를 시키는 플로우만 있어서 고민이 되는 상황입니다🤔

@parkheeddong
Copy link
Contributor

그러네요! 직접 탈퇴인 경우와 탈퇴시키는 경우 모두 동일한 방식으로 토큰을 재발급한다고 가정할 때 탈퇴 이후 첫 요청시 재발급을 하게 되면 탈퇴 플래그와 같은 추가적인 설정이 필요한 것인지 궁금했습니다! 다만 즉시 재발급을 하는 경우에는 불필요한 토큰 재발급이 이뤄질 수도 있겠네요..

Type 추론이 명확하게 필요해서 JwtTokenProvider에서 명확한 타입 제공하였습니다!
스레드 로컬의 메모리 누수가 발생하지 않게 afterCompletion 후 clear 해주었습니다.
@sohyundoh sohyundoh merged commit 8475d2f into develop Sep 18, 2024
1 check passed
@sohyundoh sohyundoh deleted the feat/#510 branch September 18, 2024 22:53
@sohyundoh sohyundoh restored the feat/#510 branch September 18, 2024 22:56
@sohyundoh sohyundoh deleted the feat/#510 branch September 25, 2024 14:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[feat] 인가 로직 개편
2 participants