원지의 개발
article thumbnail
728x90

자바측 API

  • 모든 언어는 API 통신을 위한 라이브러리들이 있음 (예를들어 js에서 비동기 통신을 이용한 카카오, 구글api)
  • 자바에서는 java.net 패키기의 URL클래스, HttpURLConnection클래스 이용하거나 외부라이브러리 HttpClient 이용
  • js에서 ajax로 하는 것을 java에서는 아래의 방식으로 사용

통신 방법

1. HttpURLConnection 객체 생성

URL url = new URL(요청주소);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

2. 요청 메서드 설정

conn.setRequestMethod("POST");
conn.setDoOutput(true); //상대방 서버로부터 결과를 받아오겠다

3. 효청 헤더 설정 (특정 이름, 값) - 필요한 값들을 담아줌

conn.setRequestProperty("Authorization", "Bearer " + 토큰값);

여기까지는 필요한 데이터에 대한 setting

4. 데이터 보내기

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream())); 

String req = "보낼데이터";
bw.write(req);
bw.flush();

5. 응답 받기

int result = conn.getResponseCode(); //결과

6. 데이터 받기

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

String result = "";
String str;
while( (str = br.readLine()) != null ) {
	result += str;
}

GSON


카카오 로그인

https://developers.kakao.com/docs/latest/ko/kakaologin/common#login

1. 플랫폼 사용 도메인 설정
2. 동의항목 선택
3. 카카오로그인 개념 이해
4. REST API 이해
5. Redirect URL 입력
6. 내 프로젝트의 화면에서 시작
7. JAVA(서버) 측에서 통신

이해

https://developers.kakao.com/docs/latest/ko/kakaologin/common

실습 - javascript

https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

출처: kakao developers

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

출처: kakao developers

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

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

BootMyWeb - java

회원 정보 페이지는 로그인 후 진입 가능

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

  • 카카오 로그인 누른 후 연결할 Redirect URI 설정

1. 요청 - 인가

<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 넣기
@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 넣기
  • 인가 코드를 받아오는 것을 옛날에는 클라이언트에서 처리했지만 지금은 서버에서 처리

2-1. 토큰 받기

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

  • 필수 파라미터를 포함한 POST로 요청
  • 요청시 content-type이 폼데이터 형식이므로 본문에 키=값&키=값... 식으로 담기
@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 이용해서 한 줄씩 읽기
    위의 응답 결과가 나옴

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

  • 제이슨 데이터 분해 후 access_token 리턴

2-2. 토큰 기반으로 유저 정보 얻기

 

//토큰 기반으로 유저정보 얻기
	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. UserController - 서비스 데이터베이스 가입, 탈퇴 등 회원 정보 처리

	//카카오 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";
	}

오늘 하루

더보기

기억에 남는 부분

 

어려운 부분

 

문제 해결 부분

 

728x90
profile

원지의 개발

@원지다

250x250