11package org .dfbf .soundlink .domain .user .service ;
22
3+ import jakarta .servlet .http .HttpServletResponse ;
34import lombok .RequiredArgsConstructor ;
45import org .dfbf .soundlink .domain .user .dto .response .KakaoTokenResponseDTO ;
56import org .dfbf .soundlink .domain .user .dto .response .KakaoUserDTO ;
1112import org .dfbf .soundlink .global .comm .enums .SocialType ;
1213import org .dfbf .soundlink .global .exception .ResponseResult ;
1314import org .springframework .beans .factory .annotation .Value ;
15+ import org .springframework .http .ResponseCookie ;
1416import org .springframework .security .crypto .bcrypt .BCryptPasswordEncoder ;
1517import org .springframework .stereotype .Service ;
1618import org .springframework .util .LinkedMultiValueMap ;
1719import org .springframework .util .MultiValueMap ;
1820
21+ import java .util .HashMap ;
1922import java .util .Map ;
2023import java .util .Optional ;
2124
@@ -28,21 +31,21 @@ public class KakaoAuthService {
2831 private final UserRepository userRepository ;
2932 private final JwtProvider jwtProvider ;
3033 private final BCryptPasswordEncoder passwordEncoder ;
31- private final TokenService tokenService ;
34+ private static final String domain = "" ;
3235
3336 @ Value ("${kakao.client-id}" )
3437 private String clientId ;
3538
3639 @ Value ("${kakao.redirect-uri}" )
3740 private String redirectUri ;
3841
39- @ Value ("${kakao.password }" )
40- private String kakaoPassword ;
42+ @ Value ("${REFRESH_TOKEN_EXPIRATION_TIME }" )
43+ private int REFRESH_TOKEN_EXPIRATION_TIME ;
4144
4245 /**
4346 * 카카오 로그인 및 JWT 발급
4447 */
45- public ResponseResult kakaoLogin (String code ) {
48+ public ResponseResult kakaoLogin (String code , HttpServletResponse response ) {
4649 // 요청 파라미터 설정 (JSONObject 대신 하나의 Key와 하나 이상의 value로 이루어진 리스트를 쌍으로 받기 위해 LinkedMultiValueMap 사용)
4750 MultiValueMap <String , String > params = new LinkedMultiValueMap <>();
4851 params .add ("grant_type" , "authorization_code" );
@@ -63,7 +66,7 @@ public ResponseResult kakaoLogin(String code) {
6366
6467 if (existingUser .isPresent ()) {
6568 // 기존 사용자가 존재 시, 로그인 처리
66- return generateTokenResponse (existingUser .get ());
69+ return generateTokenResponse (existingUser .get (), response );
6770 } else {
6871 // 신규 가입은 닉네임 중복 확인 필요
6972 if (userRepository .existsByNickname (kakaoNickname )) {
@@ -72,25 +75,26 @@ public ResponseResult kakaoLogin(String code) {
7275 }
7376 // 회원가입
7477 User newUser = registerNewKakaoUser (kakaoUser , kakaoNickname );
75- return generateTokenResponse (newUser );
78+ return generateTokenResponse (newUser , response );
7679 }
7780 }
7881
7982 /**
8083 * JWT 토큰 생성
8184 */
82- private ResponseResult generateTokenResponse (User user ) {
85+ private ResponseResult generateTokenResponse (User user , HttpServletResponse response ) {
8386 String jwtAccessToken = jwtProvider .createAccessToken (user .getUserId ());
8487 String jwtRefreshToken = jwtProvider .createRefreshToken (user .getUserId ());
8588
86- tokenService .updateRefreshToken (user .getUserId (), jwtRefreshToken );
89+ //refreshToken - 쿠키
90+ ResponseCookie refreshCookie = getRefreshToken (jwtRefreshToken );
91+ response .setHeader ("Set-Cookie" , refreshCookie .toString ());
8792
88- Map <String , String > authResponse = Map .of (
89- "accessToken" , jwtAccessToken ,
90- "refreshToken" , jwtRefreshToken
91- );
93+ //accessToken - 바디
94+ Map <String , String > responseBody = new HashMap <>();
95+ responseBody .put ("accessToken" , jwtAccessToken );
9296
93- return new ResponseResult (authResponse );
97+ return new ResponseResult (responseBody );
9498 }
9599
96100 /**
@@ -102,7 +106,7 @@ private User registerNewKakaoUser(KakaoUserDTO kakaoUser, String nickname) {
102106 .socialId (Long .valueOf (kakaoUser .id ()))
103107 .socialType (SocialType .KAKAO )
104108 .loginId ("kakao_" + kakaoUser .id ()) // 카카오 ID 기반 로그인 ID 생성
105- .password (passwordEncoder .encode (kakaoPassword ))
109+ .password (passwordEncoder .encode (null ))
106110 .email (kakaoUser .kakao_account ().email ())
107111 .build ();
108112 return userRepository .save (newUser );
@@ -123,4 +127,16 @@ private String generateUniqueNickname(String baseNickname) {
123127 }
124128 return newNickname ;
125129 }
130+
131+ // RefreshToken을 쿠키로 설정
132+ private ResponseCookie getRefreshToken (String refreshToken ) {
133+ return ResponseCookie
134+ .from ("REFRESHTOKEN" , refreshToken )
135+ .domain (domain )
136+ .path ("/" )
137+ .httpOnly (true )
138+ .secure (false )
139+ .maxAge (REFRESH_TOKEN_EXPIRATION_TIME /1000 ) // 만료시간 설정(밀리초 -> 초로 변경)
140+ .build ();
141+ }
126142}
0 commit comments