[oauth] self_read 스코프 4개로 세분화 - #431
Conversation
|
|
| val legacySelfRead = "$applicationId:self_read" | ||
| return if (legacySelfRead in clientScopes) setOf(legacySelfRead) else emptySet() |
There was a problem hiding this comment.
account_read/student_read/self_read 중 아무것도 없는 client(예: 다른 application의 스코프만 보유)가 scope 파라미터를 생략하면 여기서 emptySet()이 반환되고, 그대로 흘러갑니다.
QueryOauthSessionServiceImpl.kt:41-56→ 동의 화면에 표시할 스코프 0개CompleteOauthAuthorizeFlowServiceImpl.kt:68,105→ 빈 스코프로 code 발급- 최종적으로 스코프 없는 access token →
/userinfo403
에러 없이 "성공한 것처럼" 끝나서 클라이언트 쪽에서 원인 파악이 어렵습니다. OAuthException.InvalidScope를 던지는 편이 나아 보입니다.
참고로 Oauth2TokenServiceImpl.kt:251-257(client_credentials)은 여전히 requestedScopes.isEmpty() → clientScopes 폴백을 유지하고 있어서, 같은 서버 안에서 "scope 생략"의 의미가 두 갈래로 갈립니다. 의도된 것이면 주석 한 줄 남겨주시면 좋겠습니다.
There was a problem hiding this comment.
부분적으로 타당하다고 판단하여 9415c94 에서 반영했습니다. account_read/student_read/self_read 중 아무것도 없는 client가 scope 생략 시 OAuthException.InvalidScope를 던지도록 authorization_code 플로우를 수정했습니다. 다만 client_credentials(Oauth2TokenServiceImpl)는 이번 PR 범위 밖이라 기존 emptySet 폴백을 그대로 유지했습니다 — 두 플로우의 scope 생략 의미가 다르다는 점은 이슈로 남겨두겠습니다.
There was a problem hiding this comment.
두 플로우의 scope 생략 의미가 다르다는 점은 이슈로 남겨두겠습니다.
PR 병합전에 이슈 등록 부탁드리겠습니다
개요
OAuth
/userinfo의 단일self_read스코프를account_read/student_read/club_read/project_read4개로 세분화하였습니다.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필드를 조건부로 채우도록 변경AccountObjectResolver에includeClubs/includeProjects파라미터를 추가하여, 미부여 스코프에 대해서는 동아리·프로젝트 조회 쿼리 자체를 실행하지 않도록 최적화datagsm-web의QueryMyInfoServiceImpl(내 정보 조회)도 동일하게clubs/projects를 응답에 포함ProjectJpaCustomRepository에findAllByParticipantId신규 추가 (QueryDSL)StartOauthAuthorizeFlowServiceImpl에서scope파라미터 미입력 시client의 전체 허용 스코프 대신 기본 스코프(account_read,student_read)만 부여하도록 변경. 레거시 클라이언트가account_read/student_read를 아직 보유하지 않은 경우self_read로 폴백테스트
QueryUserInfoServiceTest: 스코프 조합별(계정만/학생 포함/동아리 포함/프로젝트 포함/self_read하위 호환) 응답 검증 케이스 추가StartOauthAuthorizeFlowServiceTest: 기본 스코프 부여 및 레거시self_read폴백 케이스 추가QueryMyInfoServiceTest:clubs/projects포함 검증 추가ktlintCheck·테스트 통과 확인후속 작업 (범위 밖)
tb_oauth_scope에account_read/student_read/club_read/project_read실제 등록은 배포 후 관리자가 수행해야 합니다.https://claude.ai/code/session_014PW7XBWgWi7ju9M1jSAFte