REST-API ํ์ฉํ ์นด์นด์ค ์์ ๋ก๊ทธ์ธ ๊ตฌํ(feat. React, SpringBoot)
REST-API๋ฅผ ํ์ฉํ ์นด์นด์ค ๋ก๊ทธ์ธ ๋ฌธ์
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
Kakao Developers
์นด์นด์ค API๋ฅผ ํ์ฉํ์ฌ ๋ค์ํ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํด๋ณด์ธ์. ์นด์นด์ค ๋ก๊ทธ์ธ, ๋ฉ์์ง ๋ณด๋ด๊ธฐ, ์น๊ตฌ API, ์ธ๊ณต์ง๋ฅ API ๋ฑ์ ์ ๊ณตํฉ๋๋ค.
developers.kakao.com
์นด์นด์ค ๊ฐ๋ฐ์ ํ์ด์ง
Kakao Developers
์นด์นด์ค API๋ฅผ ํ์ฉํ์ฌ ๋ค์ํ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํด๋ณด์ธ์. ์นด์นด์ค ๋ก๊ทธ์ธ, ๋ฉ์์ง ๋ณด๋ด๊ธฐ, ์น๊ตฌ API, ์ธ๊ณต์ง๋ฅ API ๋ฑ์ ์ ๊ณตํฉ๋๋ค.
developers.kakao.com
๐ก ๊ฐ๋จ ์์ฝ
- 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
δ Spring ์นด์นด์ค ๋ก๊ทธ์ธ REST API
์ฐธ๊ณ ์ฉ์ผ๋ก๋ง ๋ด์ฃผ์ธ์! ์ ๋ง ์ด . ๋ ต . ์ต . ๋ . ๋ค
velog.io
https://data-jj.tistory.com/53
REST-API ํ์ฉํ ์นด์นด์ค ์์ ๋ก๊ทธ์ธ ๊ตฌํ(feat. React)
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์์ ๋ก๊ทธ์ธ ๊ตฌํ์ ๋งก๊ฒ ๋์๋ค. ๋ค๋ค ํ๋ก ํธ์๋๋ ์์ ๋ก๊ทธ์ธ์์ ํ ๊ฒ ๋ง์ด ์๋ค ์ฝ๋ค~, ๊ทธ์ค์์ ์นด์นด์ค๊ฐ ๊ฐ์ฅ ์ฝ๋ค~ ์ด๋ ๊ฒ ์๊ธฐํด์ ๋ฐฉ์ฌํ๋ค. ๊ทธ๋ ๊ฒ 6์ผ๊ฐ์
data-jj.tistory.com
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Spring] Spring ์๋ฌ / Error creating bean with name 'sqlSessionFactory' defined in class path resource (0) | 2021.11.11 |
|---|
๋๊ธ