REST-API ํ์ฉํ ์นด์นด์ค ์์ ๋ก๊ทธ์ธ ๊ตฌํ(feat. React, SpringBoot)
REST-API๋ฅผ ํ์ฉํ ์นด์นด์ค ๋ก๊ทธ์ธ ๋ฌธ์
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
์นด์นด์ค ๊ฐ๋ฐ์ ํ์ด์ง
๐ก ๊ฐ๋จ ์์ฝ
- REST-API๋ฅผ ํ์ฉํ ์นด์นด์ค ๋ก๊ทธ์ธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์๋ค.
- ๊ฐ๋ฐํ๊ฒฝ : React + SpringBoot
- ํ๋ก ํธ์๋ : ์นด์นด์ค๋ก๋ถํฐ ์ธ๊ฐ์ฝ๋๋ฅผ ๋ฐ๊ณ ๋ฐ์ ์ธ๊ฐ์ฝ๋๋ฅผ ๋ฐฑ์๋์ ๋๊ฒจ์ฃผ๋ ์ญํ ์ ํ์๋ค. (+ ๋ง์ง๋ง ๋ฆฌ๋ค์ด๋ ํ ๊น์ง)
- ์ธ๊ฐ์ฝ๋๋ฅผ ๋๊ธฐ๋ฉด ๋ฐฑ์๋๋ก๋ถํฐ (์ฐ๋ฆฌ ์ฌ์ดํธ ์ ์ฉ) JWT๋ฅผ ๋ฐ๊ธ๋ฐ์๋ค.
- ๋ฐฑ์๋ : ํ๋ก ํธ๋ก๋ถํฐ ์ธ๊ฐ ์ฝ๋๋ฅผ ๋๊ฒจ๋ฐ๊ณ ์นด์นด์ค๋ก๋ถํฐ ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ํ ํฐ์ ๋ด๊ธด ์ ์ ์ ๋ณด๋ฅผ ํ์ฉํด JWT๋ฅผ ์๋กญ๊ฒ ๋ฐ๊ธ ํ ํ๋ก ํธ์๊ฒ ๋๋ ค์ค๋ค.
โ ์นด์นด์ค ํ ํฐ์ ๊ทธ๋๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ง์ ๋๊ฒจ์ฃผ๊ณ ์ฌ์ฉ์ํค๋ฉด ๊ณ ์๋นํ ์๋ ์๋ค?!
-> ํ๋ฐํธ์๋์์๋ ๊ฑฐ์ ๋ค (url+http์ ๋ณด) ์กฐํ๊ฐ ๊ฐ๋ฅํด์ ํดํน๋นํ๋ฉด ์ฌ์ฉ์์ ์นด์นด์ค ์ ๋ณด๊ฐ ์ ์ถ๋ ์๋ ์์ผ๋ ํ์คํ ๊ณ ์๋นํ ์๋ ์๋ค๊ณ ์ฐธ๊ณ ํ ์ฌ์ดํธ ๊ฐ๋ฐ์๋ถ์ด ์ธ๊ธํ์ฌ..?
→ Next.js์ SSR์ ์ด์ฉํด์ ์๋ณด์ด๊ฒ ํ ์๋ ์์ ์๋ ์๋ค๋ ํ๋ฐํธ ๊ฐ๋ฐ์๋ง์ ๋ฃ๊ธฐ๋ ๋ค์๋ค (๊ณต๋ถํด๋ด์ผ ๊ฒ ๋ค..)
์์ ๋ก๊ทธ์ธ ๊ณผ์
์ธ๊ฐ ์ฝ๋ ๋ฐ๊ธฐ-์นด์นด์ค ๊ฐ๋ฐ์ ๊ธฐ๋ณธ ์ธํ
์นด์นด์ค ๊ณต์๋ฌธ์
์นด์นด์ค ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด, ๋๋ต์ ์ผ๋ก ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐ์ ์งํํด๋๊ฐ์ผ ํ ์ง ์ ์ ์๋ค.
๋๋ต
https://kauth.kakao.com/oauth/authorize?client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&response_type=code
์ด๋ฌํ ์ฃผ์๋ก ์ ๊ทผ์ ํ๊ณ ์ธ๊ฐ ์ฝ๋๋ฅผ ๋ฐ์์ฌ ์ ์๋ค.
์ด์ cliend_id์ redirect_uri๋ฅผ ๋ฐ์์์ {CLIENT_ID}์ {REDIRECT_URI}์ ์ฑ์์ฃผ์ด์ผ ํ๋ค.
cliend_id
cliend_id๋ kakao developers์์ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ถ๊ฐํ์ ๋ ์๊ธฐ๋ REST_API ํค๋ฅผ ๋ฃ์ด์ค๋ค.
ํ๋ซํผ ์ถ๊ฐ
Web์์ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ Web ํ๋ซํผ์ ์ฌ์ดํธ ๋๋ฉ์ธ์ ์ถ๊ฐํ๋ค.
๋ฐฐํฌํ๊ธฐ ์ ์ด๊ธฐ ๋๋ฌธ์ localhost:3000์ผ๋ก ์ค์ ํ๋ค.
→ ๋ฐฐํฌํ๊ฒ ๋๋ค๋ฉด ๋ฐฐํฌํ ์ฃผ์ ์ถ๊ฐํ๋ฉด ๋๋ค.
(port๋ฒํธ → frontend์ port๋ฒํธ)
Redirect URI
์นด์นด์ค ๋ก๊ทธ์ธ์์ ์ฌ์ฉํ OAuth Redirect URI๋ฅผ ์ค์ ํ๋ค.
→ front์์
Redirect URI๋ ์นด์นด์ค ๋ก๊ทธ์ธ ๋ฉ๋ด์ ๋ค์ด๊ฐ์ ์ถ๊ฐ๋ฅผ ํด์ค๋ค. ์ด๋ ๊ฒฝ๋ก ์ค์ ์ ๋ฐฑ์๋์ ํ์ํด์ ๋ง์ถ๋ค.
oauth/callback/kakao
๋ก redirect ์ํค๊ธฐ๋ก ์ ํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ๋ฑ๋กํด์คฌ๋ค.
๐ก Redirect URI๋ ๋ฐ๋์ ํ๋ก ํธ์์ ์ ๊ทผํ ์ ์๋ Host๋ก ์ง์ ํด์ฃผ์ด์ผ ํ๋ค. → localhost:3000
์ด์ : ํ๋ฐํธ์์ ์ธ๊ฐ ์ฝ๋ ๋ฐ๊ณ ๋๊ธฐ๊ณ ๋ฑ๋ฑ ๋ชจ๋ ์์ ์ด ์ด๋ฃจ์ด์ ธ์ผ ํ๋๋ฐ
ํ๋ก ํธ์๋๊ฐ ์ ๊ทผํ ์ ์๋ Host๋ก ์ง์ ์ ํด๋ฒ๋ฆฌ๋ฉด(๋ฐฑ์๋ ํฌํธ๋ฒํธ๋ก ๋ณด๋ด๋ฒ๋ฆฐ๋ค๋์ง)
์ ๊ทผ์ด ๋ถ๊ฐํด์ ์๋ฌด ์์ ๋ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Process
Front์์ ์นด์นด์ค ๋ก๊ทธ์ธ์ผ๋ก ์ธ๊ฐ์ฝ๋ ์์ฒญ
→ ์นด์นด์ค ๋ก๊ทธ์ธ & ์๋น์ค ์ด์ฉ๋ฑ๋ก ์๋ฝ ๋ฑ๋ก
→ Redirect ํธ์ถ(Front)
→ ์ธ๊ฐ์ฝ๋๋ฅผ ์ด์ฉํด ํ ํฐ์ ๋ณด ๋ฐ๊ธฐ(Back)
→ ํ ํฐ์ ๋ณด๋ฅผ ์ด์ฉํด ์ ์ ์ ๋ณด ๋ฐ๊ธฐ(Back) → ์ ์ ๋ฑ๋ก
→ ์ ์ ์ ๋ณด ๋ฑ๋ก ํ JWT Token ๋ฆฌํด(Back → Front)
1. kakao ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ (Front)
- LoginPage.js
function socialLoginKakao() {
console.log('kakao login clicked');
AuthenticationService.loginSocialKakao();
}
- AuthenticationService.js
loginSocialKakao() {
window.location.href = KAKAO_AUTH_URL;
}
์นด์นด์ค ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ ์ ๋ ์์์ ๋ง๋ URL ์ฃผ์๋ก ์ฐ๊ฒฐ์ ์์ผ์ฃผ๋ฉด ๋๋ค.
(Client_ID์ KAKAO_AUTH_URL์ OAuth.js ์์ ๋ฐ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ๋ถ๋ฆฌํ๋ค.)
2. Redirect ํธ์ถ(Front)
- AuthenticationService.js ์์
kakaoLogin ๋น๋๊ธฐ ํต์ ์ ์ํ ๋ฉ์๋
async kakaoLogin(code) {
return await axios.get(`/api/oauth/kakao?code=${code}`);
}
→ ๋ฐฑ์ผ๋ก kakao์์ ๋ฐ์ code๋ฅผ ๋๊ธด๋ค.
- ๋ฆฌ๋ค์ด๋ ํธ๋ ํ๋ฉด OAuth2RedirectHandeler.js
// ๋ฆฌ๋ค์ด๋ ํธ๋ ํ๋ฉด
// OAuth2RedirectHandeler.js
import React, { useEffect } from 'react';
import { Oval } from 'react-loader-spinner';
import { useNavigate } from 'react-router-dom';
import AuthenticationService from 'service/AuthenticationService';
const OAuth2RedirectHandler = (props) => {
let params = new URL(document.URL).searchParams;
let code = params.get('code');
let navigate = useNavigate();
useEffect(async () => {
await AuthenticationService.kakaoLogin(code)
.then((response) => {
console.log('kakaoLogin');
console.log(response.data.data.token);
console.log(response.data.data.userEmail);
AuthenticationService.registerSuccessfulLoginForJwt(response.data.data.userEmail, response.data.data.token);
})
.catch((error) => {
console.log('kakaoLogin Failed');
});
navigate('/main');
}, []);
return (
<div>
<div>
<div>์ ์๋ง ๊ธฐ๋ค๋ ค ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ค์
๋๋ค.</div>
<Oval height="80" width="80" radius="9" color="#00Bfff" ariaLabel="three-dots-loading" wrapperStyle wrapperClass />
</div>
</div>
);
};
export default OAuth2RedirectHandler;
AuthenticationService.kakaoLogin ๋ฉ์๋๋ฅผ ์์ธํ ๋ณด๋ฉด,
await AuthenticationService.kakaoLogin(code)
.then((response) => {
console.log('kakaoLogin');
console.log(response.data.data.token);
console.log(response.data.data.userEmail);
AuthenticationService.registerSuccessfulLoginForJwt(response.data.data.userEmail, response.data.data.token);
})
.catch((error) => {
console.log('kakaoLogin Failed');
});
navigate('/main');
→ ์ฑ๊ณตํ๋ฉด ์ผ๋ฐ ๋ก๊ทธ์ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก http๋ก ์๋ต๋ฐ์ JWT Token์ localStorage์ ์ ์ฅํ๊ณ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๋๋ฉฐ ๋ฉ์ธ์ผ๋ก ์ด๋
- App.js ์์
import OAuth2RedirectHandler from 'service/OAuth2RedirectHandler';
:
:
<Route path="/oauth/callback/kakao" element={<OAuth2RedirectHandler />} />
→ App.js ์์ ํด๋น ์ปดํฌ๋ํธ ๊ฒฝ๋ก ์ค์ (Redirect๋ ํ๋ฉด)
3. ์ธ๊ฐ์ฝ๋๋ฅผ ์ด์ฉํด ํ ํฐ์ ๋ณด ๋ฐ๊ธฐ(Back)
OauthController
@ApiOperation(value = "์นด์นด์ค ๋ก๊ทธ์ธ", notes = "์นด์นด์ค ๋ก๊ทธ์ธ")
@ResponseBody
@GetMapping("/kakao")
public void kakaoCallback(@ApiParam(value = "kakao auth code", required = true) @RequestParam String code) {
String accessToken = oauthService.getKaKaoAccessToken(code);
}
โก๏ธ front → back์ผ๋ก parameter๋ก code๋ฅผ ๋ฐ๊ณ ์ด ์ฝ๋๋ฅผ ์ด์ฉํด KaKaoAccessToken์ ๋ฐ๋๋ค.
- OAuthService -
getKaKaoAccessToken
code๋ฅผ ์ด์ฉํด KaKaoAccessToken
์ ๋ฐ๋ ๋ฉ์๋
public String getKaKaoAccessToken(String code) {
String access_Token = "";
String refresh_Token = "";
String reqURL = "https://kauth.kakao.com/oauth/token";
try {
URL url = new URL(reqURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//POST ์์ฒญ์ ์ํด ๊ธฐ๋ณธ๊ฐ์ด false์ธ setDoOutput์ true๋ก
conn.setRequestMethod("POST");
conn.setDoOutput(true);
//POST ์์ฒญ์ ํ์๋ก ์๊ตฌํ๋ ํ๋ผ๋ฏธํฐ ์คํธ๋ฆผ์ ํตํด ์ ์ก
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
StringBuilder sb = new StringBuilder();
sb.append("grant_type=authorization_code");
sb.append("&client_id=" + clientId); // TODO REST_API_KEY ์
๋ ฅ
sb.append("&redirect_uri=" + redirectUri); // TODO ์ธ๊ฐ์ฝ๋ ๋ฐ์ redirect_uri ์
๋ ฅ
sb.append("&code=" + code);
bw.write(sb.toString());
bw.flush();
//๊ฒฐ๊ณผ ์ฝ๋๊ฐ 200์ด๋ผ๋ฉด ์ฑ๊ณต
int responseCode = conn.getResponseCode();
System.out.println("responseCode : " + responseCode);
//์์ฒญ์ ํตํด ์ป์ JSONํ์
์ Response ๋ฉ์ธ์ง ์ฝ์ด์ค๊ธฐ
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
String result = "";
while ((line = br.readLine()) != null) {
result += line;
}
System.out.println("response body : " + result);
//Gson ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋ ํด๋์ค๋ก JSONํ์ฑ ๊ฐ์ฒด ์์ฑ
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result);
access_Token = element.getAsJsonObject().get("access_token").getAsString();
refresh_Token = element.getAsJsonObject().get("refresh_token").getAsString();
System.out.println("access_token : " + access_Token);
System.out.println("refresh_token : " + refresh_Token);
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
return access_Token;
}
4. ํ ํฐ์ ๋ณด๋ฅผ ์ด์ฉํด ์ ์ ์ ๋ณด ๋ฐ๊ธฐ(Back) → ์ ์ ๋ฑ๋ก
KaKaoAccessToken
์ ํตํด ์นด์นด์ค์์ ํ์ํ ํด๋น ์ ์ ์ ์ ๋ณด๋ฅผ ๋ฐ๋ ๋ฉ์๋
public HashMap<String, Object> getUserKakaoInfo(String access_Token) {
// ์์ฒญํ๋ ํด๋ผ์ด์ธํธ๋ง๋ค ๊ฐ์ง ์ ๋ณด๊ฐ ๋ค๋ฅผ ์ ์๊ธฐ์ HashMapํ์
์ผ๋ก ์ ์ธ
HashMap<String, Object> userInfo = new HashMap<String, Object>();
String reqURL = "https://kapi.kakao.com/v2/user/me";
try {
URL url = new URL(reqURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
// ์์ฒญ์ ํ์ํ Header์ ํฌํจ๋ ๋ด์ฉ
conn.setRequestProperty("Authorization", "Bearer " + access_Token);
int responseCode = conn.getResponseCode();
System.out.println("responseCode : " + responseCode);
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
String result = "";
while ((line = br.readLine()) != null) {
result += line;
}
System.out.println("response body : " + result);
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result);
String id = element.getAsJsonObject().get("id").getAsString();
JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();
JsonObject kakao_account = element.getAsJsonObject().get("kakao_account").getAsJsonObject();
String nickname = properties.getAsJsonObject().get("nickname").getAsString();
if(kakao_account.getAsJsonObject().get("email") != null){
String email = kakao_account.getAsJsonObject().get("email").getAsString();
userInfo.put("email", email);
}
userInfo.put("nickname", nickname);
userInfo.put("id", id);
} catch (IOException e) {
e.printStackTrace();
}
return userInfo;
}
5. ์ ์ ์ ๋ณด ๋ฑ๋ก ํ JWT Token ๋ฆฌํด(Back → Front)
์์์ ์ป์ ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์ฐ๋ฆฌ ์ ์ ์ ๋ฑ๋กํ ๋ค, ์ฐ๋ฆฌ ์๋ฒ ์ ์ฉ JWT Token์ ํ๋ฐํธ๋ก ๋๊ฒจ์ค๋ค.
Back
OAuthService.java
- kakaoLogin
kakao๋ก๊ทธ์ธ ์ ์ด๋ฏธ ํ์๊ฐ์ ์ด ์งํ๋ ์ ์ ์ธ์ง(์ด๋ฏธ ์นด์นด์ค ๋ก๊ทธ์ธ ๋์ํ๊ณ ๋ฑ๋ก๋ ์ ์ )ํ์ธํ๋ค.
ํ์ธํ๊ณ userEmail์ ์ด์ฉํด ์ผ๋ฐ ์ ์ ์ฒ๋ผ JWT Token์ ๋ฐ๊ธํ์ฌ return ํ๋ค.
public UserKakaoLoginResponseDto kakaoLogin(String access_Token) {
UserKakaoSignupRequestDto userKakaoSignupRequestDto = getUserKakaoSignupRequestDto(getUserKakaoInfo(access_Token));
UserResponseDto userResponseDto = findByUserKakaoIdentifier(userKakaoSignupRequestDto.getUserKakaoIdentifier());
if (userResponseDto == null){
signUp(userKakaoSignupRequestDto);
userResponseDto = findByUserKakaoIdentifier(userKakaoSignupRequestDto.getUserKakaoIdentifier());
}
String token = jwtTokenProvider.createToken(userResponseDto.getUserEmail());
return new UserKakaoLoginResponseDto(HttpStatus.OK, token, userResponseDto.getUserEmail());
}
- findByUserKakaoIdentifier
์ด๋ฏธ ํ์๊ฐ์ ์ฒ๋ฆฌ๋ ์นด์นด์ค ๋ก๊ทธ์ธ ์ ์ ์ธ์ง ํ์ธ.
public UserResponseDto findByUserKakaoIdentifier(String kakaoIdentifier) {
List<User> user = userRepository.findUserByUserKakaoIdentifier(kakaoIdentifier).orElseThrow(() -> new UsernameNotFoundException("ํด๋นํ๋ ์ ์ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค."));
if(user.size() == 0){
return null;
}
return new UserResponseDto(user.get(0));
}
→ List๋ก ๋์ด์๋ ์ด์ ๋ ์ผ๋ฐ ์ฌ์ฉ์๋ค์ผ ๊ฒฝ์ฐ kakaoIdentifier
๊ฐ ํ์๊ฐ ์์ด ์ผ๋จ ์์ ํ์ง ์๊ณ null๋ก ๊ทธ๋ฅ ๋์๋๋ฐ, ๊ทธ๋์ entity์์ ํด๋น ๋ณ์๋ฅผ unique๋ nullable ์ฒ๋ฆฌ๋ฅผ ํ์ง ๋ชปํด์ ์กฐํ์ List๋ก ๋ถ๋ฌ์์ง ๊ฐ๋ฅ์ฑ ๋๋ฌธ์ JPA์ด์ฉ์ ๋ค๊ฑด ์กฐํ์ ์ ์ฌํ๊ฒ ์ฌ์ฉํด์ผ ํด์ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์๋ค.
โ๏ธ โก๏ธ ์๋๋ ์ผ๋ฐ์ ์ ์๊ฒ “-1”์ด๋ “0”๊ณผ ๊ฐ์ ๋ํดํธ ๊ฐ์ ์ฃผ๊ณ nullable = false
์ฒ๋ฆฌ๋ผ๋ ํ๋ ๊ฒ ๋ง๋ ๊ฒ ๊ฐ๋ค.
- signUp
๋ฑ๋ก๋์ด ์์ง ์์ ์ ์ ์ผ ๊ฒฝ์ฐ
kakao์์ ๋ฐ์ user์ id๋ฅผ user_kakao_identifier
๋ก ๋ฑ๋กํ๊ณ , ๋น๋ฐ๋ฒํธ๋ ํ์ํ์ง ์์ -1
๋ก ๋๊ณ ์ ์ฅํ๋ค.
@Transactional
public Long signUp(UserKakaoSignupRequestDto userKakaoSignupRequestDto) throws BaseException {
Long id;
try {
id = userRepository.save(userKakaoSignupRequestDto.toEntity()).getUserId();
} catch (Exception e) {
throw new BaseException(BaseResponseCode.FAILED_TO_SAVE_USER);
}
return id;
}
private UserKakaoSignupRequestDto getUserKakaoSignupRequestDto(HashMap<String, Object> userInfo){
String userPassword = "-1";
UserKakaoSignupRequestDto userKakaoSignupRequestDto = new UserKakaoSignupRequestDto(userInfo.get("email").toString(), userInfo.get("nickname").toString(),userPassword,userInfo.get("nickname").toString(),userInfo.get("id").toString());
return userKakaoSignupRequestDto;
}
OAuthController.java
@ApiOperation(value = "์นด์นด์ค ๋ก๊ทธ์ธ", notes = "์นด์นด์ค ๋ก๊ทธ์ธ")
@ResponseBody
@GetMapping("/kakao")
public BaseResponse<UserLoginResponseDto> kakaoCallback(@ApiParam(value = "kakao auth code", required = true) @RequestParam String code) {
String accessToken = oauthService.getKaKaoAccessToken(code);
return new BaseResponse(oauthService.kakaoLogin(accessToken).getStatus(), "์์ฒญ ์ฑ๊ณตํ์ต๋๋ค.", oauthService.kakaoLogin(accessToken));
}
→ token๊ณผ ์ด๋ฉ์ผ(ํ๋ฐํธ์์ ํ์ฌ ์ ์ ์ ์ฅํ ๋ ํ์ํด์)์ ๋ฆฌํดํ๋๋ก ํ๋ค.
Front
- OAuth2RedirectHandeler.js
๋ฆฌ๋ค์ด๋ ํธ ๋ ํ๋ฉด์ธ๋ฐ ์ฌ๊ธฐ์ ๋ณด๋ฉด
์๋ต๊ฒฐ๊ณผ์์ userEmail๊ณผ token์ ๊ฐ์ง๊ณ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ ๋ ์ ์๋๋ก ์ผ๋ฐ ์ ์ ์ ๋์ผํ๊ฒ JWTํ ํฐ๊ณผ email์ localStorage์ ์ ์ฅํ ์ ์๋๋กํ๋ค.
AuthenticationService.registerSuccessfulLoginForJwt(response.data.data.userEmail, response.data.data.token);
useEffect(async () => {
await AuthenticationService.kakaoLogin(code)
.then((response) => {
console.log('kakaoLogin');
console.log(response.data.data.token);
console.log(response.data.data.userEmail);
AuthenticationService.registerSuccessfulLoginForJwt(response.data.data.userEmail, response.data.data.token);
})
.catch((error) => {
console.log('kakaoLogin Failed');
});
navigate('/main');
}, []);
front์์ ์ฒ๋ฆฌํด์ค์ผ ํ ๋ถ๋ถ๊ณผ back์์ ์ฒ๋ฆฌํ ๋ถ๋ถ์ ์ ์๊ฐํ๊ณ ๋๋๊ณ , ํต์ ํ๋ฉด ์ ๊ตฌํํ ์ ์๋ ๊ฒ ๊ฐ๋ค.
์ฒ์์๋ ์ข ํค๋งธ๋๋ฐ, ์นด์นด์ค ์์ ๋ก๊ทธ์ธ ๋ฐฉ๋ฒ์ ๋ง์ด ์ฐพ์๋ณด๊ณ , ๊ณต์ ๋ฌธ์๋ ๋ณด๊ณ ํ๋ฆ์ ์ดํดํ๋๊น ๊ทธ ๋ค์๋ถํฐ๋ ์ ๊ตฌํํ ์ ์์๋ ๊ฒ ๊ฐ๋ค..
๋ ๐ง
Reference
๊ฐ์ฌํ ๋ถ๋ค...๐ฅฒ
https://velog.io/@ohjs813/Spring-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-REST-API
https://data-jj.tistory.com/53
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Spring ์๋ฌ / Error creating bean with name 'sqlSessionFactory' defined in class path resource (0) | 2021.11.11 |
---|
๋๊ธ