Skip to content

[BE] Sisc1-209 구글 로그인 시 유저 없을 시 유저 생성 로직 추가#113

Merged
Kosw6 merged 9 commits intomainfrom
SISC1-209-BE-redirect-url-프론트로-전달
Nov 16, 2025

Hidden character warning

The head ref may contain hidden characters: "SISC1-209-BE-redirect-url-\ud504\ub860\ud2b8\ub85c-\uc804\ub2ec"
Merged

[BE] Sisc1-209 구글 로그인 시 유저 없을 시 유저 생성 로직 추가#113
Kosw6 merged 9 commits intomainfrom
SISC1-209-BE-redirect-url-프론트로-전달

Conversation

@msciki7
Copy link
Contributor

@msciki7 msciki7 commented Nov 16, 2025

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • Google OIDC 기반 인증 지원 추가
    • 첫 로그인 시 자동 계정 생성 및 연동 기능 추가
  • 개선 사항

    • OAuth2 인증 시 저장된 사용자 정보 활용으로 데이터 일관성 개선
    • 인증 쿠키 처리 최적화

@coderabbitai
Copy link

coderabbitai bot commented Nov 16, 2025

주요 변경 사항

이 풀 리퀘스트는 OAuth2 및 OIDC 인증 처리를 개선하여 데이터베이스에서 사용자 정보를 조회하고, 새로운 OIDC 사용자 서비스를 추가하며, 쿠키 보안 설정을 조정합니다.

변경 사항

내용
OIDC 사용자 서비스 통합
backend/src/main/java/org/sejongisc/backend/common/auth/config/CustomOidcUserService.java
OAuth2 사용자 속성 개선
backend/src/main/java/org/sejongisc/backend/common/auth/config/CustomOAuth2UserService.java
쿠키 보안 설정 조정
backend/src/main/java/org/sejongisc/backend/common/auth/config/OAuth2SuccessHandler.java

시퀀스 다이어그램

sequenceDiagram
    participant User
    participant OIDC as OIDC Provider<br/>(Google)
    participant CustomOidcUserService
    participant UserRepository
    participant UserOauthAccountRepository
    participant SecurityContext

    User->>OIDC: 로그인 요청
    OIDC-->>User: OIDC 클레임 반환
    User->>CustomOidcUserService: loadUser(OidcUserRequest)
    
    rect rgb(200, 220, 255)
    Note over CustomOidcUserService: OIDC 클레임에서 사용자 정보 추출
    CustomOidcUserService->>UserRepository: findByEmail() 조회
    alt 사용자 미존재
        CustomOidcUserService->>UserRepository: 새 User 생성<br/>(email, name, TEAM_MEMBER)
        CustomOidcUserService->>UserOauthAccountRepository: UserOauthAccount 생성<br/>(provider=GOOGLE, providerUid=sub)
    end
    end
    
    rect rgb(220, 240, 220)
    Note over CustomOidcUserService: 속성 강화 및 DefaultOidcUser 반환
    CustomOidcUserService->>CustomOidcUserService: 속성에 userId, provider, email 추가
    CustomOidcUserService->>SecurityContext: OidcUser 반환
    end
    
    SecurityContext-->>User: 인증 완료
Loading

코드 리뷰 난이도 평가

🎯 3 (중간) | ⏱️ ~20-25분

추가 검토 영역:

  • CustomOidcUserService: 새로운 트랜잭션 기반 OIDC 통합 로직이 데이터베이스 상호작용을 정확히 처리하는지 확인
  • CustomOAuth2UserService의 미사용 변수 fName: 예상된 동작인지 또는 잠재적 버그인지 확인
  • 쿠키 보안 설정 변경(secure=false, SameSite=Lax): 보안 요구 사항과의 일치성 검증 필요
  • Google OIDC와 기존 OAuth2 흐름 간의 사용자 중복 및 일관성 확인

관련 가능성 있는 풀 리퀘스트

추천 리뷰어

  • discipline24

🐰 Google의 손을 잡고,

데이터베이스와 춤을 추며,

사용자들을 맞이하네.

OIDC 새로운 길에서

보안과 편의가 만난다! 🔐✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 주요 변경사항과 완벽하게 일치합니다. 구글 로그인 시 사용자 없을 경우 사용자 생성 로직을 추가하는 것이 CustomOidcUserService의 핵심 변경사항입니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch SISC1-209-BE-redirect-url-프론트로-전달

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
backend/src/main/java/org/sejongisc/backend/common/auth/config/OAuth2SuccessHandler.java (1)

98-112: OAuth2SuccessHandler의 쿠키 보안 설정을 프로덕션 환경에 맞게 수정하세요.

검증 결과, OAuth2SuccessHandler.java의 쿠키 설정(lines 98-112)이 로컬 개발용 값(secure(false), sameSite("Lax"))으로 하드코딩되어 있어 프로덕션에 배포될 경우 보안 위험이 발생합니다.

같은 프로젝트의 AuthController.java(lines 132-138, 195-201, 267-273, 324-330)는 secure(true), sameSite("None")으로 설정되어 있으므로, OAuth2SuccessHandler도 AuthController와 동일한 프로덕션 설정을 적용해야 합니다.

수정 필요 부분 (lines 98-112):

ResponseCookie accessCookie = ResponseCookie.from("access", accessToken)
        .httpOnly(true)
        .secure(true)      // 프로덕션용으로 변경
        .sameSite("None")  // 프로덕션용으로 변경
        .path("/")
        .maxAge(60L * 60)
        .build();

ResponseCookie refreshCookie = ResponseCookie.from("refresh", refreshToken)
        .httpOnly(true)
        .secure(true)      // 프로덕션용으로 변경
        .sameSite("None")  // 프로덕션용으로 변경
        .path("/")
        .maxAge(60L * 60 * 24 * 14)
        .build();
♻️ Duplicate comments (1)
backend/src/main/java/org/sejongisc/backend/common/auth/config/CustomOidcUserService.java (1)

49-71: 코드 중복에 대한 참고 사항.

이 사용자 생성/조회 로직은 CustomOAuth2UserService.java의 85-104번 줄과 중복됩니다. CustomOAuth2UserService.java에 대한 리뷰 댓글에서 이미 리팩토링을 제안했으니 참고해 주세요.

🧹 Nitpick comments (4)
backend/src/main/java/org/sejongisc/backend/common/auth/config/CustomOAuth2UserService.java (2)

82-82: 사용하지 않는 변수를 제거하세요.

fName 변수가 선언되었지만 메서드 내에서 사용되지 않습니다.

다음 diff를 적용하여 사용하지 않는 변수를 제거하세요:

 final String fProviderUid = providerUid;
 final String fEmail = email;
-final String fName = name;
 final AuthProvider fAuthProvider = AuthProvider.valueOf(provider.toUpperCase());

85-104: CustomOidcUserService와 코드 중복을 제거하는 것을 고려하세요.

이 사용자 생성/조회 로직은 CustomOidcUserService.java의 49-71번 줄과 거의 동일합니다. 공통 메서드로 추출하여 DRY 원칙을 준수하는 것이 좋습니다.

예를 들어, 다음과 같은 공통 유틸리티 메서드를 생성할 수 있습니다:

private User findOrCreateUser(AuthProvider provider, String providerUid, String email, String name) {
    return oauthAccountRepository
        .findByProviderAndProviderUid(provider, providerUid)
        .map(UserOauthAccount::getUser)
        .orElseGet(() -> {
            User newUser = User.builder()
                    .email(email)
                    .name(name)
                    .role(Role.TEAM_MEMBER)
                    .build();
            User saved = userRepository.save(newUser);

            UserOauthAccount oauth = UserOauthAccount.builder()
                    .user(saved)
                    .provider(provider)
                    .providerUid(providerUid)
                    .build();
            oauthAccountRepository.save(oauth);

            return saved;
        });
}

그런 다음 두 서비스 모두 이 메서드를 재사용할 수 있습니다.

backend/src/main/java/org/sejongisc/backend/common/auth/config/CustomOidcUserService.java (2)

40-40: 주석 처리된 로그의 일관성을 개선하세요.

40번 줄의 주석 처리된 로그에 // 앞에 공백이 있습니다. 코드베이스 전체에서 일관된 주석 스타일을 유지하는 것이 좋습니다. 파일의 다른 주석 처리된 로그(35번 줄)와 일치시켜 주세요.

-       // log.info("OIDC claims: {}", original);
+        // log.info("OIDC claims: {}", original);

69-69: 주석 처리된 로그의 일관성을 개선하세요.

69번 줄의 주석 처리된 로그에도 // 앞에 공백이 있습니다. 일관성을 위해 들여쓰기를 수정해 주세요.

-                  //  log.info("[CustomOidcUserService] 신규 User 및 UserOauthAccount 생성됨");
+                    // log.info("[CustomOidcUserService] 신규 User 및 UserOauthAccount 생성됨");
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0cdcfc8 and 9b0df6f.

📒 Files selected for processing (3)
  • backend/src/main/java/org/sejongisc/backend/common/auth/config/CustomOAuth2UserService.java (4 hunks)
  • backend/src/main/java/org/sejongisc/backend/common/auth/config/CustomOidcUserService.java (3 hunks)
  • backend/src/main/java/org/sejongisc/backend/common/auth/config/OAuth2SuccessHandler.java (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
backend/src/main/java/org/sejongisc/backend/common/auth/config/CustomOidcUserService.java (2)
backend/src/main/java/org/sejongisc/backend/common/auth/config/CustomOAuth2UserService.java (1)
  • Slf4j (25-122)
backend/src/main/java/org/sejongisc/backend/common/auth/config/OAuth2SuccessHandler.java (1)
  • Slf4j (32-129)
🔇 Additional comments (1)
backend/src/main/java/org/sejongisc/backend/common/auth/config/CustomOidcUserService.java (1)

81-91: 익명 서브클래스 패턴이 적절하게 사용되었습니다.

getAttributes() 메서드를 재정의하기 위해 익명 서브클래스를 사용한 것은 커스텀 attributes를 DefaultOidcUser에 주입하기 위한 유효한 접근 방식입니다. 이 패턴은 OIDC 사용자의 attributes를 OAuth2SuccessHandler에 전달하는 데 효과적입니다.

Comment on lines +37 to +39
// log.info("[CustomOAuth2UserService] loadUser START");
=======
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

병합 충돌 마커를 제거하세요.

37-39번 줄에 주석 처리된 로그와 함께 "=======" 구분자가 남아 있습니다. 이는 병합 충돌 마커처럼 보이며 프로덕션 코드에 포함되어서는 안 됩니다.

다음 diff를 적용하여 불필요한 구분자를 제거하세요:

-        // log.info("[CustomOAuth2UserService] loadUser START");
-=======
-        
+        // log.info("[CustomOAuth2UserService] loadUser START");
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// log.info("[CustomOAuth2UserService] loadUser START");
=======
// log.info("[CustomOAuth2UserService] loadUser START");
🤖 Prompt for AI Agents
backend/src/main/java/org/sejongisc/backend/common/auth/config/CustomOAuth2UserService.java
lines 37-39: remove the leftover merge conflict marker ("=======") and any
surrounding conflict artifacts so the file contains only the intended code or
comment (you may keep or restore the commented log line but must delete the
"=======" line); ensure no other conflict markers remain and the file compiles
cleanly.

@Kosw6 Kosw6 merged commit 4d61b50 into main Nov 16, 2025
1 check passed
@Kosw6 Kosw6 deleted the SISC1-209-BE-redirect-url-프론트로-전달 branch November 16, 2025 07:59
@coderabbitai coderabbitai bot mentioned this pull request Jan 29, 2026
22 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants