์นด์นด์ค ๋ก๊ทธ์ธ API (OAuth 2.0)
ํด๋ผ์ด์ธํธ ์ ์ฅ์์ ์๋ง์ ์ฌ์ดํธ์ ๋ชจ๋ ์์ด๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ธฐ์ตํ๊ธฐ๋ ์ฝ์ง ์์
๋ํ ์๋น์ค๋ฅผ ์ ๊ณตํด์ฃผ๋ ๋ฆฌ์์ค ์ค๋ ๋ํ ์์ ํ๊ฒ ๋ณด๊ดํ์ฌ์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ถ๋ด
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์นด์นด์ค ๋ก๊ทธ์ธ ์ฐ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉ
์นด์นด์ค API๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
1. ์นด์นด์ค ๊ฐ๋ฐ์ ์ฌ์ดํธ์ ๊ฐ์ ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๋ฑ๋กํ๊ธฐ
์นด์นด์ค API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋จผ์ ์นด์นด์ค ๊ฐ๋ฐ์ ์ฌ์ดํธ์ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
๊ฐ์ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฑ๋กํ๊ณ , ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ๊ธฐ๋ฅ๊ณผ ํค๋ฅผ ๋ฐ๊ธ๋ฐ์์ผ ํฉ๋๋ค.
2. SDK ๋ค์ด๋ก๋ ๋ฐ ์ค์ ํ๊ธฐ
์นด์นด์ค API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ SDK๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ์ค์ ํด์ผ ํฉ๋๋ค.
์นด์นด์ค ๊ฐ๋ฐ์ ์ฌ์ดํธ์์ SDK๋ฅผ ๋ค์ด๋ก๋ ๋ฐ๊ณ , ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์นด์นด์ค REST API๋ SDK๋ฅผ ๋ค์ด๋ก๋ํ์ง ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
3. ์นด์นด์ค ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ
SDK๋ฅผ ์ค์ ํ ํ, ์นด์นด์ค ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์ด๋, ๋ก๊ทธ์ธ ๋ฒํผ์ ๋ง๋ค๊ณ ํด๋น ๋ฒํผ์ ๋๋ ์ ๋ ์นด์นด์ค ๋ก๊ทธ์ธ API๋ฅผ ํธ์ถํ๋๋ก ๊ตฌํํ๋ฉด ๋ฉ๋๋ค.
๋ก๊ทธ์ธ ์์ฒญ ์ฃผ์(GET)
GET /oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code HTTP/1.1
Host: kauth.kakao.com
<a class="p-2" href="https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=http://localhost:8080/auth/kakao/callback&response_type=code">
<img th:src="@{/img/kakao_login_medium.jpg}" style="height:60px"/> </a>
์นด์นด์ค ๋ก๊ทธ์ธ ๋์ ํ๋ฉด์ ํธ์ถํ๊ณ , ์ฌ์ฉ์ ๋์๋ฅผ ๊ฑฐ์ณ ์ธ๊ฐ ์ฝ๋๋ฅผ ๋ฐ๊ธํฉ๋๋ค.
Redirect URI : ์นด์นด์ค ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ ๋ค์ ์๋ต๋ฐ์ ์ฃผ์๋ฅผ ์ค์ ํ๋ค.
์นด์นด์ค์์ ์ฌ์ฉ์ ์ ๋ณด๋ค์ Redirect URI์ ์ ๋ฌํ๋ค.
์๋น์ค ์๋ฒ๋ redirect_uri๋ก HTTP 302 ๋ฆฌ๋ค์ด๋ ํธ๋ ์์ฒญ์ Location์์ ์ธ๊ฐ ์ฝ๋ ๋๋ ์๋ฌ๋ฅผ ํ์ธํ ์ ์๋ค.
์ธ๊ฐ ์ฝ๋๋ ๋์ ํ๋ฉด์ ํตํด ์ธ๊ฐ๋ฐ์ ๋์ ํญ๋ชฉ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉฐ, ์ธ๊ฐ ์ฝ๋๋ฅผ ์ฌ์ฉํด ํ ํฐ ๋ฐ๊ธฐ๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค.
4. ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์ฌ์ฉ์ ์ ๋ณด ๋ฐ์์ค๊ธฐ
์ธ๊ฐ ์ฝ๋๋ก ํ ํฐ ๋ฐ๊ธ์ ์์ฒญํฉ๋๋ค.
์ธ๊ฐ ์ฝ๋ ๋ฐ๊ธฐ๋ง์ผ๋ก๋ ์นด์นด์ค ๋ก๊ทธ์ธ์ด ์๋ฃ๋์ง ์์ผ๋ฉฐ, ํ ํฐ ๋ฐ๊ธฐ๊น์ง ๋ง์ณ์ผ ์นด์นด์ค ๋ก๊ทธ์ธ์ ์ ์์ ์ผ๋ก ์๋ฃํ ์ ์์ต๋๋ค.
์นด์นด์ค ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์์ฌ ์ ์์ต๋๋ค.
์ด๋, ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด์๋ ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ์์ผ ํฉ๋๋ค.
์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ์ ํ, ํด๋น ํ ํฐ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
ํ ํฐ ๋ฐ๊ธ ์์ฒญ ์ฃผ์(POST)
curl -v -X POST "https://kauth.kakao.com/oauth/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "client_id=${REST_API_KEY}" \
--data-urlencode "redirect_uri=${REDIRECT_URI}" \
-d "code=${AUTHORIZE_CODE}"
ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ํฌํจํด POST๋ก ์์ฒญํฉ๋๋ค.
POST ๋ฐฉ์ - ์ฟผ๋ฆฌ์คํธ๋ง(GET๋ฐฉ์)์ด ์๋ http body ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
//HttpHeader ์ค๋ธ์ ํธ ์์ฑ
HttpHeaders headers = new HttpHeaders();
headers.add("Content-type","application/x-www-form-urlencoded;charset=utf-8");
Content-Type: application/x-www-form-urlencoded
--> http body ๋ฐ์ดํฐ๊ฐ key=value ํํ์ ๋ฐ์ดํฐ๋ผ๊ณ ํค๋์ ์๋ ค์ฃผ๋ ๊ฒ์ด๋ค.
//HttpBody ์ค๋ธ์ ํธ ์์ฑ
LinkedMultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type","authorization_code");
params.add("client_id","{REST_API_KEY}");
params.add("redirect_uri","http://localhost:8080/auth/kakao/callback");
params.add("code",code);
HTTP body ์ ๋ฐ์ดํฐ๋ฅผ ๋ด์์ ์ ๋ฌํด์ผ ํ๋ค. (POST ๋ฐฉ์)
// HttpHeader์ HttpBody๋ฅผ ํ๋์ ์ค๋ธ์ ํธ์ ๋ด๊ธฐ
HttpEntity<MultiValueMap<String,String>> kakaoTokenRequest =
new HttpEntity<>(params,headers);
RestTemplate.exchange() ๋ฉ์๋๊ฐ HttpEntity ๋ฅผ ๊ฐ๊ธฐ๋๋ฌธ์
HttpHeader์ HttpBody๋ฅผ ํ๋์ ์ค๋ธ์ ํธ์ ๋ด๋๋ค.
RestTemplate rt = new RestTemplate();
//Http POST ๋ฐฉ์ ์์ฒญ - response ๋ณ์ ์๋ต
ResponseEntity<String> response = rt.exchange(
"https://kauth.kakao.com/oauth/token", // ํ ํฐ ๋ฐ๊ธ ์์ฒญ ์ฃผ์
HttpMethod.POST,
kakaoTokenRequest,
String.class
);
RestTemplate.exchange() ๋ฉ์๋๋ฅผ ์ด์ฉ
์์ฒญ ์ฑ๊ณต ์ ์๋ต์ ํ ํฐ๊ณผ ํ ํฐ ์ ๋ณด๋ฅผ ํฌํจํ๋ค.
# ์ฐธ๊ณ : RestTemplate
RestTemplate์ Spring ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ HTTP ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
RESTful ์น ์๋น์ค์ ์ํธ์์ฉํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
RestTemplate์ ์ฌ์ฉํ๋ฉด GET, POST, PUT, DELETE ๋ฑ์ HTTP ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์น ์๋น์ค์ ํต์ ํ ์ ์์ต๋๋ค.
๋ํ HTTP ์์ฒญ ๋ฐ ์๋ต์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์์ฒญ ํค๋์ ์๋ต ํค๋, ์ฟ ํค, JSON ๋ฐ XML ๋ฉ์์ง์ ๋ณํ ๋ฑ์ด ์์ต๋๋ค.
exchange()
RestTemplate์ exchange() ๋ฉ์๋๋ HTTP ์์ฒญ์ ๋ณด๋ด๊ณ ๊ทธ์ ๋ํ HTTP ์๋ต์ ๋ฐ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ด ๋ฉ์๋๋ HTTP ๋ฉ์๋, ์์ฒญ URL, ์์ฒญ ํค๋, ์์ฒญ ๋ณธ๋ฌธ ๋ฐ์ดํฐ ๋ฐ ์๋ต ๋ฐ์ดํฐ ํ์ ๋ฑ์
๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์์ HTTP ์์ฒญ์ ์คํํ๊ณ ,
HTTP ์๋ต์ ๋ฐ์์ ์ง์ ๋ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๋ณํํ์ฌ ๋ฐํํฉ๋๋ค.
exchange() ๋ฉ์๋๋ ๋ค์ํ HTTP ๋ฉ์๋(GET, POST, PUT, DELETE ๋ฑ)๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ์ ๋ณด๋ผ ์ ์์ผ๋ฉฐ,
์์ฒญ๊ณผ ์๋ต์ ์ปค์คํฐ๋ง์ด์ง์ ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ด exchange() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ GET ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ์ ์ ์์ต๋๋ค.
RestTemplate restTemplate = new RestTemplate();
String url = "https://api.example.com/user/{userId}";
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + accessToken);
HttpEntity<String> entity = new HttpEntity<>(headers);
ResponseEntity<User> response = restTemplate.exchange(url, HttpMethod.GET, entity, User.class, userId);
User user = response.getBody();
์ ์ฝ๋์์๋ url ๋ณ์์ ์์ฒญํ URL์ ์ง์ ํ๊ณ , headers ๋ณ์์ ์์ฒญ ํค๋๋ฅผ ์ค์ ํ ํ HttpEntity ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
์ด HttpEntity ๊ฐ์ฒด๋ ์์ฒญ ํค๋์ ์์ฒญ ๋ณธ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ์ญํ ์ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ exchange() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋, ์์ฒญ ๋ฉ์๋(HttpMethod.GET), HttpEntity ๊ฐ์ฒด, ์๋ต ๋ฐ์ดํฐ ํ์ (User.class),
๊ทธ๋ฆฌ๊ณ URL ๋ณ์(userId)๋ฅผ ์ ๋ฌํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ResponseEntity ๊ฐ์ฒด์์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ user ๋ณ์์ ํ ๋นํฉ๋๋ค.
Response
{
"token_type":"bearer",
"access_token":"${ACCESS_TOKEN}",
"expires_in":43199,
"refresh_token":"${REFRESH_TOKEN}",
"refresh_token_expires_in":25184000,
"scope":"account_email profile"
}
Response : JSON ํ์ ๋ฐ์ดํฐ๋ฅผ ์๋ต๋ฐ์
JSON ๋ฐ์ดํฐ๋ฅผ Java์์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ์ค๋ธ์ ํธ์ ๋ด๋๋ค. (๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉ - Gson, Json Simple, ObjectMapper)
//Gson, Json Simple, ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
OAuthToken oAuthToken = null;
try {
oAuthToken = objectMapper.readValue(response.getBody(), OAuthToken.class);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
ObjectMapper ๋ฅผ ์ด์ฉํ์ฌ JSON ๋ฐ์ดํฐ๋ฅผ Java ๊ฐ์ฒด์ ๋งคํ
# ์ฐธ๊ณ : ObjectMapper (JSON ํ์ฑ)
๋ฌธ์๋ก ๋ JSON ๋ฐ์ดํฐ๋ฅผ Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ objectMapper ๋ฅผ ์ฌ์ฉํด์ ์๋ฐ ๊ฐ์ฒด๋ก ๋ณํํ๋ค.
JSON ํ์ผ์ Java ๊ฐ์ฒด๋ก deserialization ํ๊ธฐ ์ํด์๋ ObjectMapper์ readValue() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค.
ObjectMapper
ObjectMapper๋ฅผ ์ด์ฉํ๋ฉด JSON์ Java ๊ฐ์ฒด๋ก ๋ณํ
๋ฐ๋๋ก Java ๊ฐ์ฒด๋ฅผ JSON ๊ฐ์ฒด๋ก serialization ํ ์ ์๋ค.
Java Object → JSON
Java ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก serialization ํ๊ธฐ ์ํด์๋ ObjectMapper์ writeValue() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค.
// Java Object -> JSON
Person person = new Person("zooneon", 25, "seoul");
try {
objectMapper.writeValue(new File("src/person.json"), person);
} catch (IOException e) {
e.printStackTrace();
}
์์ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๋ก JSON์ ์ ์ฅํ ํ์ผ๊ณผ ์ง๋ ฌํ์ํฌ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
JSON → Java Object
JSON ํ์ผ์ Java ๊ฐ์ฒด๋ก deserialization ํ๊ธฐ ์ํด์๋ ObjectMapper์ readValue() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค.
// JSON -> Java Object
String json = "{\"name\":\"zooneon\",\"age\":25,\"address\":\"seoul\"}";
try {
Person deserializedPerson = objectMapper.readValue(json, Person.class);
System.out.println(deserializedPerson);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
์์ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๋ก JSON ํํ์ ๋ฌธ์์ด or ๊ฐ์ฒด์ ์ญ์ง๋ ฌํ ์ํฌ ํด๋์ค๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
ํ์ฌ ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
GET/POST /v2/user/me HTTP/1.1
Host: kapi.kakao.com
Authorization: Bearer ${ACCESS_TOKEN}/KakaoAK ${APP_ADMIN_KEY}
Content-type: application/x-www-form-urlencoded;charset=utf-8
์ฌ์ฉ์ ์ก์ธ์ค ํ ํฐ์ ํค๋(Header)์ ๋ด์ GET ๋๋ POST๋ก ์์ฒญํฉ๋๋ค.
//HttpHeader ์ค๋ธ์ ํธ ์์ฑ
HttpHeaders headers2 = new HttpHeaders();
headers2.add("Authorization"," Bearer "+oAuthToken.getAccess_token());
headers2.add("Content-type","application/x-www-form-urlencoded;charset=utf-8");
HttpHeader ๋ฅผ ์์ฑํ ์ก์ธ์ค ํ ํฐ๊ณผ content-type์ ๋ด๋๋ค.
HttpEntity<MultiValueMap<String,String>> kakaoProfileRequest2 =
new HttpEntity<>(headers2);
RestTemplate.exchange() ๋ฉ์๋๊ฐ HttpEntity ๋ฅผ ๊ฐ๊ธฐ๋๋ฌธ์
HttpHeader๋ฅผ HttpEntity์ ๋ด๋๋ค.
//Http POST ๋ฐฉ์ ์์ฒญ - response ๋ณ์ ์๋ต
ResponseEntity<String> response2 = rt2.exchange(
"https://kapi.kakao.com/v2/user/me", // ์ฌ์ฉ์ ์ ๋ณด ์์ฒญ ์ฃผ์
HttpMethod.POST,
kakaoProfileRequest2,
String.class
);
RestTemplate.exchange() ๋ฉ์๋๋ฅผ ์ด์ฉ
์ฌ์ฉ์ ์ ๋ณด ์์ฒญ ์ฑ๊ณต ์, ์๋ต ๋ฐ๋(Body)๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํฌํจํ JSON ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
JSON ํ์ผ์ Java ํด๋์ค๋ก ๋ง๋ค์
https://www.jsonschema2pojo.org/
jsonschema2pojo๋ JSON ์คํค๋ง๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐ ํด๋์ค๋ฅผ ์์ฑํ๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
Property word delimiters ๊ฐ ์ธ๋์ค์ฝ์ด(_)๋ก ์ค์ ๋์ด ์๋ค๋ฉด, ์์ ๋๋ก ํ์
ObjectMapper objectMapper2 = new ObjectMapper();
KakaoProfile kakaoProfile = null;
try {
kakaoProfile = objectMapper2.readValue(response2.getBody(), KakaoProfile.class);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
JSON ํ์ผ์ jsonschema2pojo ํตํด์ ์์ฑํ Java ํด๋์ค ๊ฐ์ฒด๋ก deserialization ํ๊ธฐ ์ํด์๋
ObjectMapper์ readValue() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค.
System.out.println(" ์ฌ์ฉ์ ์ด๋ฉ์ผ = " + kakaoProfile.getKakao_account().getEmail());
System.out.println(" ์ฌ์ฉ์ ์ด๋ฆ = " + kakaoProfile.getProperties().getNickname());
์ด์ ๊ฐ์ฒด๋ฅผ ํตํด์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ป์ด์ฌ ์ ์๋ค.
5. ๋ก๊ทธ์์ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ
๋ง์ง๋ง์ผ๋ก, ๋ก๊ทธ์์ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์ด๋, ์นด์นด์ค ๋ก๊ทธ์์ API๋ฅผ ํธ์ถํ์ฌ ๋ก๊ทธ์์ํ ์ ์์ต๋๋ค.
ํ ํฐ์ ๋ง๋ฃ์์ผ ํด๋น ์ฌ์ฉ์ ์ ๋ณด๋ก ๋ ์ด์ ์นด์นด์ค API๋ฅผ ํธ์ถํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฅ
์นด์นด์ค๊ณ์ ๊ณผ ํจ๊ป ๋ก๊ทธ์์ ๊ธฐ๋ฅ์ ์นด์นด์ค๊ณ์ ๋ก๊ทธ์์ ์ฒ๋ฆฌ ํ
Logout Redirect URI๋ก 302 ๋ฆฌ๋ค์ด๋ ํธ(Redirect)ํ์ฌ ์๋น์ค ๋ก๊ทธ์์๊น์ง ์ฐ์ํด์ ์ํํ ์ ์๋๋ก ๊ตฌ์ฑ๋ผ ์์ต๋๋ค.
href="https://kauth.kakao.com/oauth/logout?client_id=${REST_API_KEY}&logout_redirect_uri=http://localhost:8080/auth/kakao/logout">๋ก๊ทธ์์</a>
๋ก๊ทธ์์ ๋ฒํผ ํด๋ฆญ ์ ์นด์นด์ค ๋ก๊ทธ์์ API๋ฅผ ํธ์ถ
REST API๋ฅผ ์ฌ์ฉํ ์นด์นด์ค ๋ก๊ทธ์ธ
์นด์นด์ค REST API๋ SDK๋ฅผ ๋ค์ด๋ก๋ํ์ง ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
REST API๋ ์น ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋กํ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ํต์ ์ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ฐ๋ผ์, ์นด์นด์ค REST API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ HTTP ์์ฒญ์ ๊ตฌ์ฑํ๊ณ , ์๋ต์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฅ๋ ฅ์ด ํ์ํฉ๋๋ค.
์นด์นด์ค REST API๋ HTTP ์์ฒญ์ ํ์ํ URL, HTTP ๋ฉ์๋, ํ๋ผ๋ฏธํฐ ๋ฑ์ ์ ๊ณตํ๊ณ , ์๋ต์ JSON ํํ๋ก ์ ๊ณต๋ฉ๋๋ค.
์ด๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด ์กฐํ, ๋ฉ์์ง ์ ์ก ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
'Develop > API' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ChatGPT API๋ฅผ ์คํ๋ง ํ๋ ์์ํฌ์์ ์จ๋ณด๊ธฐ (0) | 2023.04.10 |
---|