Skip to content

[oauth] self_read 스코프 4개로 세분화 - #431

Open
ZaMan0806 wants to merge 12 commits into
developfrom
feature/oauth-scope-segmentation
Open

[oauth] self_read 스코프 4개로 세분화#431
ZaMan0806 wants to merge 12 commits into
developfrom
feature/oauth-scope-segmentation

Conversation

@ZaMan0806

Copy link
Copy Markdown
Collaborator

개요

OAuth /userinfo의 단일 self_read 스코프를 account_read/student_read/club_read/project_read 4개로 세분화하였습니다. self_read는 하위 호환을 위해 deprecated 상태로 유지하였습니다.

본문

배경

기존에는 datagsm:self_read 하나로 계정·학생 정보를 모두 반환하고 있었으며, 동아리·프로젝트 소속 정보는 제공하지 않았습니다. 클라이언트가 필요한 정보만 선택적으로 요청할 수 있도록 스코프를 세분화하였습니다.

주요 변경 사항

  • OAuthScope 신규 4종 도입: account_read(계정 기본 정보), student_read(학생/선생님 상세 정보), club_read(소속 동아리), project_read(참여 프로젝트)
  • self_read는 삭제하지 않고 account_read + student_read와 동등하게 동작하도록 유지 (deprecated, 하위 호환)
  • SecurityConfig에서 /userinfo 접근 조건을 account_read 또는 self_read 중 하나를 보유한 경우로 완화
  • QueryUserInfoServiceImpl에서 보유 스코프에 따라 student/teacher/clubs/projects 필드를 조건부로 채우도록 변경
  • AccountObjectResolverincludeClubs/includeProjects 파라미터를 추가하여, 미부여 스코프에 대해서는 동아리·프로젝트 조회 쿼리 자체를 실행하지 않도록 최적화
  • datagsm-webQueryMyInfoServiceImpl(내 정보 조회)도 동일하게 clubs/projects를 응답에 포함
  • ProjectJpaCustomRepositoryfindAllByParticipantId 신규 추가 (QueryDSL)
  • StartOauthAuthorizeFlowServiceImpl에서 scope 파라미터 미입력 시 client의 전체 허용 스코프 대신 기본 스코프(account_read, student_read)만 부여하도록 변경. 레거시 클라이언트가 account_read/student_read를 아직 보유하지 않은 경우 self_read로 폴백

테스트

  • QueryUserInfoServiceTest: 스코프 조합별(계정만/학생 포함/동아리 포함/프로젝트 포함/self_read 하위 호환) 응답 검증 케이스 추가
  • StartOauthAuthorizeFlowServiceTest: 기본 스코프 부여 및 레거시 self_read 폴백 케이스 추가
  • QueryMyInfoServiceTest: clubs/projects 포함 검증 추가
  • 전체 모듈 빌드·ktlintCheck·테스트 통과 확인

후속 작업 (범위 밖)

  • 운영 DB tb_oauth_scopeaccount_read/student_read/club_read/project_read 실제 등록은 배포 후 관리자가 수행해야 합니다.

https://claude.ai/code/session_014PW7XBWgWi7ju9M1jSAFte

@ZaMan0806 ZaMan0806 added the enhancement:개선작업 새 기능 또는 기존 코드 개선에 관한 내용입니다 label Sep 3, 2026
@github-actions github-actions Bot added the waiting for review:검토 대기 확인을 대기하고 있습니다 label Sep 3, 2026
@pr-agent-demo

pr-agent-demo Bot commented Sep 3, 2026

Copy link
Copy Markdown

⚠️ Auto-review failed: . Retry with /review.

Comment on lines +107 to +108
val legacySelfRead = "$applicationId:self_read"
return if (legacySelfRead in clientScopes) setOf(legacySelfRead) else emptySet()

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

account_read/student_read/self_read 중 아무것도 없는 client(예: 다른 application의 스코프만 보유)가 scope 파라미터를 생략하면 여기서 emptySet()이 반환되고, 그대로 흘러갑니다.

  • QueryOauthSessionServiceImpl.kt:41-56 → 동의 화면에 표시할 스코프 0개
  • CompleteOauthAuthorizeFlowServiceImpl.kt:68,105 → 빈 스코프로 code 발급
  • 최종적으로 스코프 없는 access token → /userinfo 403

에러 없이 "성공한 것처럼" 끝나서 클라이언트 쪽에서 원인 파악이 어렵습니다. OAuthException.InvalidScope를 던지는 편이 나아 보입니다.

참고로 Oauth2TokenServiceImpl.kt:251-257(client_credentials)은 여전히 requestedScopes.isEmpty() → clientScopes 폴백을 유지하고 있어서, 같은 서버 안에서 "scope 생략"의 의미가 두 갈래로 갈립니다. 의도된 것이면 주석 한 줄 남겨주시면 좋겠습니다.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

부분적으로 타당하다고 판단하여 9415c94 에서 반영했습니다. account_read/student_read/self_read 중 아무것도 없는 client가 scope 생략 시 OAuthException.InvalidScope를 던지도록 authorization_code 플로우를 수정했습니다. 다만 client_credentials(Oauth2TokenServiceImpl)는 이번 PR 범위 밖이라 기존 emptySet 폴백을 그대로 유지했습니다 — 두 플로우의 scope 생략 의미가 다르다는 점은 이슈로 남겨두겠습니다.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

두 플로우의 scope 생략 의미가 다르다는 점은 이슈로 남겨두겠습니다.
PR 병합전에 이슈 등록 부탁드리겠습니다

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

#435 이슈 등록하였습니다.

Comment thread datagsm-oauth-authorization/src/main/resources/application.yml
@ZaMan0806 ZaMan0806 changed the title [oauth] self:read 스코프 4개로 세분화 [oauth] self_read 스코프 4개로 세분화 Sep 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement:개선작업 새 기능 또는 기존 코드 개선에 관한 내용입니다 waiting for review:검토 대기 확인을 대기하고 있습니다

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[oauth] 사용자 정보 OAuth 권한 범위 세분화 및 기본 권한 범위 정책 개선

2 participants