참고 링크
Spring Boot를 이용해 카카오 로그인 만들기 (프로젝트 첫 생성부터 구현까지)
1. 링크 실행
https://developers.kakao.com/console/app
카카오계정
accounts.kakao.com
2. 애플리케이션 추가

3. 앱 이름, 사업자명 등록

4. 추가된 애플리케이션 클릭 → 플랫폼 등록
- Android, iOS, Web 중 필요한 플랫폼 등록
 - Web
 

5. 추가한 애플리케이션 클릭 → 앱 키 → REST API 키 복사 (나중에 사용 예정)

6. 메뉴바에서 카카오 로그인 클릭

- 활성화 설정 OFF → ON으로 변경
 - Redirect URI 등록 → 로그인 경로 삽입
 
7. 카카오 로그인 프론트 페이지
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com

8. 리소스 다운로드 클릭 → 다운로드(.png) 클릭

- resources/static/img 경로에 다운 받은 이미지 삽입
 

9. mavenrepository 링크 접속 후 의존성 주입
https://mvnrepository.com/artifact/com.google.code.gson/gson/2.10.1
10. templates 경로에 html 추가
- https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=REST_API_KEY&redirect_uri=REDIRECT_URI
 - REST_API_KEY → 5번에서 복사한 키 값 넣기
 - REDIRECT_URI → 6번에서 입력한 값 넣기
 
<body>     <h1>Kakao Login Test</h1>     <span th:if="${userId == null}">         <a href="https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=REST_API_KEY&redirect_uri=REDIRECT_URI">             <img src = "img/kakao_login_medium_narrow.png">         </a>     </span>     <span th:if="${userId != null}">         <form name="logout" action="http://localhost:8088/logout">             <input type="submit" value="로그아웃">         </form>     </span> </body> 
11. application.properties에 코드 추가
spring.thymeleaf.prefix=classpath:templates/ spring.thymeleaf.check-template-location=true spring.thymeleaf.suffix=html spring.thymeleaf.mode=HTML5 spring.thymeleaf.cache=false spring.thymeleaf.template-resolver-order=0 
12. springboot 실행하면 해당 화면처럼 보일 예정

13. Controller & KakaoAPI 클래스 추가
- Controller
 
package com.example.kakao_login_test;   import jakarta.servlet.http.HttpSession; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView;   import java.util.HashMap;   @RestController public class HomeController {       KakaoAPI kakaoAPI = new KakaoAPI();       @RequestMapping("/login")     public ModelAndView login(@RequestParam("code") String code, HttpSession session) {         ModelAndView mav = new ModelAndView();           // 1. 인증코드 요청 전달         String access_token = kakaoAPI.getAccessToken(code);           // 2. 인증코드로 토큰 전달         HashMap<String, Object> userInfo = kakaoAPI.getUserInfo(access_token);           System.out.println("login info : " + userInfo.toString());           if(userInfo.get("email") != null) {             session.setAttribute("userId", userInfo.get("email"));             session.setAttribute("accessToken", access_token);         }           mav.addObject("userId", userInfo.get("email"));         mav.setViewName("index");         return mav;     }       @RequestMapping("/logout")     public ModelAndView logout(HttpSession session) {         ModelAndView mav = new ModelAndView();           kakaoAPI.kakaoLogout((String) session.getAttribute("accessToken"));         session.removeAttribute("accessToken");         session.removeAttribute("userId");         mav.setViewName("index");           return mav;     } } 
- KakaoAPI
 
→ https://kapi.kakao.com/v2/user/me 복사
→ https://kauth.kakao.com/oauth/token 복사
- JavaScript 키
 

- redirect_url → 전에 설정한 로그인 경로
 
package com.example.kakao_login_test;   import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser;   import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import java.util.HashMap;   public class KakaoAPI {       public String getAccessToken(String code) {         String accessToken = "";         String refreshToken = "";         String reqURL = "https://kauth.kakao.com/oauth/token";           try {             URL url = new URL(reqURL);             HttpURLConnection conn = (HttpURLConnection) url.openConnection();             conn.setRequestMethod("POST");             conn.setDoOutput(true);               BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));             StringBuilder sb = new StringBuilder();             sb.append("grant_type=authorization_code");             sb.append("&client_id=JavaScript키");             sb.append("&redirect_url=앞에서 추가한 redirect_url 추가");             sb.append("&code=" + code);               bw.write(sb.toString());             bw.flush();               int responseCode = conn.getResponseCode();             System.out.println("response code = " + 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);              accessToken = element.getAsJsonObject().get("access_token").getAsString();            refreshToken = element.getAsJsonObject().get("refresh_token").getAsString();              br.close();            bw.close();         } catch (Exception e) {             e.printStackTrace();         }         return accessToken;     }   public HashMap<String, Object> getUserInfo(String accessToken) {         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("POST");             conn.setRequestProperty("Authorization", "Bearer " + accessToken);             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);               JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();             JsonObject kakaoAccount = element.getAsJsonObject().get("kakao_account").getAsJsonObject();               String nickname = properties.getAsJsonObject().get("nickname").getAsString();             String email = kakaoAccount.getAsJsonObject().get("email").getAsString();               userInfo.put("nickname", nickname);             userInfo.put("email", email);         } catch (Exception e) {             e.printStackTrace();         }         return userInfo;     }       public void kakaoLogout(String accessToken) {         String reqURL = "https://kapi.kakao.com/v1/user/logout";         try {             URL url = new URL(reqURL);             HttpURLConnection conn = (HttpURLConnection) url.openConnection();             conn.setRequestMethod("POST");             conn.setRequestProperty("Authorization", "Bearer " + accessToken);             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(result);           } catch (Exception e) {             e.printStackTrace();         }     } } 
14. 동의 항목 설정
- 필요한 항목들 동의 항목 설정
 
https://developers.kakao.com/console/app/967025/product/login/scope
카카오계정
accounts.kakao.com

15. 로그인/로그아웃 성공
- 에러 날 경우 참고할 페이지
 
https://developers.kakao.com/docs/latest/ko/kakaologin/trouble-shooting
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
'Web & Android > Spring Security' 카테고리의 다른 글
| [Spring Security] SNS 로그인 (0) | 2023.10.19 | 
|---|---|
| [Spring Security] OAuth 2.0을 이용한 인증 (1) | 2023.10.19 | 
| [Spring Security] Access Token+ Refresh Token을 이용한 인증 (1) | 2023.10.19 | 
| [Spring Security] Access Token을 이용한 인증 (0) | 2023.10.19 | 
| [Spring Security] 세션과 쿠키를 이용한 인증 (0) | 2023.10.17 | 
