Conversation
🐛 쿠키 바디 둘다 토큰 내려주기
Summary of ChangesHello @hiwon-lee, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! 이 PR은 인증 시스템의 리프레시 토큰 처리 방식을 유연하게 개선합니다. 기존에는 쿠키를 통해서만 리프레시 토큰을 받았지만, 이제 요청 본문을 통해서도 토큰을 받을 수 있도록 확장하여 클라이언트의 다양한 요구사항에 대응할 수 있게 되었습니다. 또한, 불필요한 테스트 엔드포인트를 제거하여 코드의 간결성을 높였습니다. Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
| // 디버깅 로그 | ||
| log.info("[REFRESH] Cookie header = {}", request.getHeader("Cookie")); | ||
| log.info("[REFRESH] cookie refresh present = {}", refreshTokenFromCookie != null); | ||
| log.info("[REFRESH] body refresh present = {}", body != null && body.getRefreshToken() != null && !body.getRefreshToken().isBlank()); |
There was a problem hiding this comment.
디버깅 목적으로 추가된 로그들이 INFO 레벨로 기록되고 있습니다. 운영 환경에서 불필요한 로그가 많이 남을 수 있으므로 DEBUG 레벨로 변경하는 것을 권장합니다. 특히 request.getHeader("Cookie")를 그대로 로깅하면 리프레시 토큰 외 다른 민감한 정보가 포함된 쿠키가 노출될 수 있는 보안 위험이 있습니다. 이 로그들은 제거하거나, 꼭 필요하다면 DEBUG 레벨로 변경하고 실제 운영에서는 비활성화하는 것이 안전합니다.
| // 디버깅 로그 | |
| log.info("[REFRESH] Cookie header = {}", request.getHeader("Cookie")); | |
| log.info("[REFRESH] cookie refresh present = {}", refreshTokenFromCookie != null); | |
| log.info("[REFRESH] body refresh present = {}", body != null && body.getRefreshToken() != null && !body.getRefreshToken().isBlank()); | |
| // 디버깅 로그 | |
| log.debug("[REFRESH] Cookie header = {}", request.getHeader("Cookie")); | |
| log.debug("[REFRESH] cookie refresh present = {}", refreshTokenFromCookie != null); | |
| log.debug("[REFRESH] body refresh present = {}", body != null && body.getRefreshToken() != null && !body.getRefreshToken().isBlank()); |
|
|
||
| import com.example.tikitaka.global.config.auth.dto.AuthResponse; | ||
| import com.example.tikitaka.global.config.auth.dto.KakaoCodeRequest; | ||
| import com.example.tikitaka.global.config.auth.dto.*; |
There was a problem hiding this comment.
와일드카드(*) import는 코드 가독성을 해치고 잠재적인 이름 충돌을 유발할 수 있으므로, 필요한 클래스를 명시적으로 import하는 것이 좋습니다. Google Java Style Guide에서도 와일드카드 import 사용을 지양하도록 권장하고 있습니다.
| import com.example.tikitaka.global.config.auth.dto.*; | |
| import com.example.tikitaka.global.config.auth.dto.AuthResponse; | |
| import com.example.tikitaka.global.config.auth.dto.KakaoCodeRequest; | |
| import com.example.tikitaka.global.config.auth.dto.LoginResponse; | |
| import com.example.tikitaka.global.config.auth.dto.RefreshRequest; | |
| import com.example.tikitaka.global.config.auth.dto.RefreshResponse; |
| String refreshToken = null; | ||
| if (body != null && body.getRefreshToken() != null && !body.getRefreshToken().isBlank()) { | ||
| refreshToken = body.getRefreshToken().trim(); | ||
| } else if (refreshTokenFromCookie != null && !refreshTokenFromCookie.isBlank()) { | ||
| refreshToken = refreshTokenFromCookie.trim(); | ||
| } |
There was a problem hiding this comment.
refreshToken을 가져오는 로직이 다소 장황합니다. Spring의 StringUtils.hasText()를 사용하면 코드를 더 간결하고 명확하게 만들 수 있습니다. hasText()는 null, 빈 문자열, 공백만 있는 문자열을 모두 한 번에 확인해줍니다. 이 제안을 적용하려면 org.springframework.util.StringUtils를 import해야 합니다.
| String refreshToken = null; | |
| if (body != null && body.getRefreshToken() != null && !body.getRefreshToken().isBlank()) { | |
| refreshToken = body.getRefreshToken().trim(); | |
| } else if (refreshTokenFromCookie != null && !refreshTokenFromCookie.isBlank()) { | |
| refreshToken = refreshTokenFromCookie.trim(); | |
| } | |
| String refreshToken = null; | |
| if (body != null && org.springframework.util.StringUtils.hasText(body.getRefreshToken())) { | |
| refreshToken = body.getRefreshToken().trim(); | |
| } else if (org.springframework.util.StringUtils.hasText(refreshTokenFromCookie)) { | |
| refreshToken = refreshTokenFromCookie.trim(); | |
| } |
| public Map<String, String> issue(@PathVariable Long memberId) { | ||
| String token = jwtTokenProvider.createAccessToken(memberId); | ||
| return Map.of("accessToken", token); | ||
| // 쿠키가 지금 문제라면 일시적으로 아래 2줄 주석 처리해도 됨 |
#️⃣ 연관된 이슈
#️⃣ 작업 내용
#️⃣ 테스트 결과
#️⃣ 변경 사항 체크리스트
#️⃣ 스크린샷 (선택)
#️⃣ 리뷰 요구사항 (선택)
📎 참고 자료 (선택)