
1. 자바측 API
- 모든 언어는 API 통신을 위한 라이브러리들이 있음 (예를들어 js에서 비동기 통신을 이용한 카카오, 구글api)
- 자바에서는 java.net 패키기의 URL클래스, HttpURLConnection클래스 이용하거나 외부라이브러리 HttpClient 이용
- js에서 ajax로 하는 것을 java에서는 아래의 방식으로 사용
1.1. 통신 방법
1. HttpURLConnection 객체 생성
<java />
URL url = new URL(요청주소);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
2. 요청 메서드 설정
<java />
conn.setRequestMethod("POST");
conn.setDoOutput(true); //상대방 서버로부터 결과를 받아오겠다
3. 효청 헤더 설정 (특정 이름, 값) - 필요한 값들을 담아줌
<java />
conn.setRequestProperty("Authorization", "Bearer " + 토큰값);
여기까지는 필요한 데이터에 대한 setting
4. 데이터 보내기
<java />
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
String req = "보낼데이터";
bw.write(req);
bw.flush();
5. 응답 받기
<java />
int result = conn.getResponseCode(); //결과
6. 데이터 받기
<java />
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String result = "";
String str;
while( (str = br.readLine()) != null ) {
result += str;
}
2. GSON



3. 카카오 로그인
https://developers.kakao.com/docs/latest/ko/kakaologin/common#login
1. 플랫폼 사용 도메인 설정
2. 동의항목 선택
3. 카카오로그인 개념 이해
4. REST API 이해
5. Redirect URL 입력
6. 내 프로젝트의 화면에서 시작
7. JAVA(서버) 측에서 통신
3.1. 이해
https://developers.kakao.com/docs/latest/ko/kakaologin/common

3.2. 실습 - javascript
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com

- OpenID Connection: 카카오 로그인 시 액세스 토큰과 ID 토큰을 함께 발급




- 카카오톡 채널은 원래 비즈니스용으로 해야하지만, 테스트용으로도 만들 수 있음

2023.01.06 - [클라이언트/JavaScript] - [JavaScript] AJAX, API, fetch, Promise, then, json, xml
[JavaScript] AJAX, API, fetch, Promise, then, json, xml
ES5 ▶ XMLHttpRequest, fetch(), ajax(), Axois 등 XMLHttpRequest: ajax 프로그램에 사용할 수 있는 객체 AJAX (비동기 통신) Asynchronous Javascript ans XML 웹페이지의 이동 없이 필요한 데이터만 전송하는 기술 ex) 구글
j-won950101.tistory.com
https://developer-sudal.tistory.com/77
[JS] 카카오 로그인 API 구현 방법
java script 의 openAPI 를 이용해서 직접 만든 사이트의 로그인 부분에 카카오 로그인을 구현해보려고 합니다. 카카오는 카카오 디벨로퍼에 openAPI가 잘 설명되어 있어서 어떤 기능이 있고 어떻게 구
developer-sudal.tistory.com
3.3. BootMyWeb - java



- 로그인이 되어 있지 않으면 /main으로 진입 불가 (인터셉터 사용)
- 회원가입도 /main 진입 전 사용


- 카카오 로그인 누른 후 연결할 Redirect URI 설정
3.3.1. 1. 요청 - 인가
<java />
<script th:inline="javascript">
//폼 제출과는 관계X
$(".kakaoBtn").click(function () {
location.href = "https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code"
})
</script>
- ${ } 들어내고 내 api key와 컨트롤러로 보낼 uri 넣기
<java />
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired //서비스 영역과 같음
private KakaoAPI kakaoAPI;
//카카오 redirect_uri
@GetMapping("/kakao")
public String kakao(@RequestParam("code") String code) {
System.out.println("인가코드:" + code);
return "redirect:/main";
}


- 컨트롤러에 연결한 카카오 redirect_uri 넣기
- 인가 코드를 받아오는 것을 옛날에는 클라이언트에서 처리했지만 지금은 서버에서 처리
3.3.2. 2-1. 토큰 받기


- KakaoAPI 만들어서 아까 받은 인가 코드로 토큰 받고, 토큰 기반으로 유저 정보 얻어오는 기능 생성


- 필수 파라미터를 포함한 POST로 요청
- 요청시 content-type이 폼데이터 형식이므로 본문에 키=값&키=값... 식으로 담기
<java />
@Component("kakao") //정확히 정해진 역할 없이 빈으로 정하고 싶으면 component 어노테이션
public class KakaoAPI {
//application.properties
@Value("${kakao.client.id}")
private String clientId;
//토큰발급기능
public String getAccessToken(String code) {
String requestURL = "https://kauth.kakao.com/oauth/token";
String redirect_uri= "http://127.0.0.1:8484/user/kakao";
String refresh_token = "";
String access_token = "";
//post의 폼데이터 형식 키=값&키=값...
String data = "grant_type=authorization_code"
+ "&client_id=" + clientId
+ "&redirect_uri=" + redirect_uri
+ "&code=" + code;
try {
URL url = new URL(requestURL);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST"); //post형식
conn.setDoOutput(true); //카카오서버로부터 데이터 응답을 허용
//데이터 전송을 위한 클래스
//OutputStream out = conn.getOutputStream();
//OutputStreamWriter osw = new OutputStreamWriter(out);
//BufferedWriter br = new BufferedWriter(osw);
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(conn.getOutputStream()));
bw.write(data);
bw.flush();
//응답 결과를 conn객체에서 받음
System.out.println( "요청결과:" + conn.getResponseCode() );
if(conn.getResponseCode() == 200 ) { //요청성공
BufferedReader br = new BufferedReader(new InputStreamReader( conn.getInputStream() ));
String result = "";
String str = null;
while( (str = br.readLine() ) != null ) { //한줄씩읽음 - 읽을값이 없다면 null
result += str;
}
System.out.println(result);
//제이슨 데이터 분해
JsonParser json = new JsonParser(); //com.google.~~
JsonElement element = json.parse(result); //json데이터 전달
JsonObject obj = element.getAsJsonObject(); //json오브젝트 형변환
access_token = obj.get("access_token").getAsString();
refresh_token = obj.get("refresh_token").getAsString();
}
} catch (Exception e) {
e.printStackTrace();
}
return access_token;
}


- 컨트롤러에서 받아온 인가코드를 넣어서 요청한 다음

- 요청 결과를 conn 객체에서 받음
- BufferedReader 이용해서 한 줄씩 읽기
위의 응답 결과가 나옴

<java />
//제이슨 파서
implementation 'com.google.code.gson:gson:2.8.5'
- build.gradle에 GSON 추가

- 제이슨 데이터 분해 후 access_token 리턴
3.3.3. 2-2. 토큰 기반으로 유저 정보 얻기




<java />
//토큰 기반으로 유저정보 얻기
public Map<String, Object> getUserInfo(String access_token) {
//데이터 저장할 map
Map<String, Object> map = new HashMap<>();
String requestURL = "https://kapi.kakao.com/v2/user/me";
try {
URL url = new URL(requestURL);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST"); //post형식
conn.setDoOutput(true); //카카오서버로부터 데이터 응답을 허용
//헤더에 토큰정보를 추가
conn.setRequestProperty("Authorization", "Bearer " + access_token);
System.out.println("토큰요청결과:" + conn.getResponseCode() );
if(conn.getResponseCode() == 200 ) {
BufferedReader br = new BufferedReader(new InputStreamReader( conn.getInputStream() ));
String result = "";
String str = null;
while( (str = br.readLine() ) != null ) { //한줄씩읽음 - 읽을값이 없다면 null
result += str;
}
System.out.println(result);
//추가로 뽑은 것
JsonParser json = new JsonParser();
JsonElement element = json.parse(result);
//json에서 key를 꺼내고, 다시 key를 꺼낸다.
JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();
JsonObject kakao_account = element.getAsJsonObject().get("kakao_account").getAsJsonObject();
String nickname = properties.getAsJsonObject().get("nickname").getAsString();
String email = kakao_account.getAsJsonObject().get("email").getAsString();
//맵에 저장
map.put("nickname", nickname);
map.put("email", email);
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
3.3.4. 3. UserController - 서비스 데이터베이스 가입, 탈퇴 등 회원 정보 처리
<java />
//카카오 redirect_uri
@GetMapping("/kakao")
public String kakao(@RequestParam("code") String code) {
System.out.println("인가코드:" + code);
String token = kakaoAPI.getAccessToken(code);
System.out.println("어세스토큰:" + token);
Map<String, Object> map = kakaoAPI.getUserInfo(token);
System.out.println("사용자데이터(닉네임, 이메일):" + map.toString());
//서비스 데이터베이스(Database)의 가입, 탈퇴 등 회원 정보 처리는 서비스에서 자체 구현
//카카오는 서비스 데이터에 접근하지 않으므로 회원 정보를 대신 저장하거나 삭제할 수 없음
//서비스 서버는 카카오로부터 받은 사용자 정보로 회원가입 되어 있는지 확인
//1. 이미 회원 - 해당 사용자의 로그인에 대한 세션 발급 후, 로그인 완료 처리
//2. 회원 X - 카카오에서 받은 정보로 서비스 데이터베이스에 회원가입 처리
return "redirect:/main";
}
오늘 하루
기억에 남는 부분
-
-
어려운 부분
-
-
문제 해결 부분
-
-
'Server > Spring boot' 카테고리의 다른 글
[인프런] 스프링 부트와 JPA 활용1 - 구현 준비, 회원, 상품 도메인 개발 (0) | 2024.09.12 |
---|---|
[인프런] 스프링 부트와 JPA 활용1 - 환경설정 및 도메인 분석 설계 (0) | 2024.09.05 |
[Spring Boot] BootMyweb (4) - 세션, redirect, interceptor (0) | 2023.02.22 |
[Spring Boot] BootMyweb (3) - 파일 업로드, 불러오기, selectKey (0) | 2023.02.21 |
[Spring Boot] RestAPI, 부메랑, @RestController, @RequestBody, CrossOrigin (0) | 2023.02.16 |