티스토리 뷰
카카오 로그인 REST API를 Java 환경에서 구축하는 방법을 단계별로 상세히 정리해 드립니다. 본 가이드는 Spring Boot 환경을 기준으로 하며, 인가 코드 요청부터 사용자 정보 조회(로그인 완료) 단계까지의 핵심 로직과 예제 코드를 포함합니다.
[JAVA] 카카오 로그인 REST API 구현 가이드
카카오 로그인은 OAuth 2.0 표준 프로토콜을 따르며, 크게 인가 코드 받기, 토큰 받기, 사용자 정보 가져오기의 3단계로 구성됩니다.
Step 1: 카카오 디벨로퍼스 설정
코드를 작성하기 전, 카카오 디벨로퍼스에서 어플리케이션 설정을 완료해야 합니다.
- 내 애플리케이션 추가: 앱 이름과 사업자명을 입력하여 생성합니다.
- REST API 키 확인: [내 애플리케이션] > [앱 설정] > [앱 키]에서 REST API 키를 복사해둡니다.
- 플랫폼 등록: [제품 설정] > [카카오 로그인] > [플랫폼]에서 Web 플랫폼을 선택하고 사이트 도메인(예: http://localhost:8080)을 등록합니다.
- Redirect URI 설정: [카카오 로그인] 메뉴에서 활성화 상태를 ON으로 바꾸고, 인가 코드를 받을 URI(예: http://localhost:8080/login/kakao)를 등록합니다.
- 동의항목 설정: [카카오 로그인] > [동의항목]에서 닉네임, 이메일 등 필요한 정보의 수집 권한을 설정합니다.
Step 2: 의존성(Dependencies) 추가
HTTP 요청을 편리하게 처리하기 위해 HttpURLConnection 대신 RestTemplate이나 WebClient를 사용할 수 있습니다. 여기서는 범용적인 JSON 처리를 위해 Gson 또는 Jackson을 포함합니다.
pom.xml (Maven)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JSON 파싱용 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
</dependencies>
Step 3: 인가 코드(Authorize Code) 요청
사용자가 "카카오 로그인" 버튼을 눌렀을 때 실행되는 단계입니다. 카카오 인증 서버로 사용자를 리다이렉트시켜 로그인 및 동의 화면을 띄웁니다.
Controller 예제
@GetMapping("/kakao/login")
public String getKakaoAuthUrl() {
String reqUrl = "https://kauth.kakao.com/oauth/authorize"
+ "?client_id={REST_API_KEY}"
+ "&redirect_uri={REDIRECT_URI}"
+ "&response_type=code";
// 실제 개발 시에는 {REST_API_KEY}와 {REDIRECT_URI}를 본인의 설정값으로 치환하세요.
return "redirect:" + reqUrl;
}
Step 4: 액세스 토큰(Access Token) 발급
사용자가 동의를 완료하면 카카오는 설정한 Redirect URI로 인가 코드(code)를 보내줍니다. 서버는 이 코드를 받아 카카오 서버에 토큰 발급을 요청해야 합니다.
Service 로직 예제
public String getAccessToken(String authorize_code) {
String accessToken = "";
String reqURL = "https://kauth.kakao.com/oauth/token";
try {
URL url = new URL(reqURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// POST 요청을 위한 설정
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=본인의_REST_API_키");
sb.append("&redirect_uri=http://localhost:8080/login/kakao");
sb.append("&code=" + authorize_code);
bw.write(sb.toString());
bw.flush();
// 결과 코드가 200이라면 성공
int responseCode = conn.getResponseCode();
// 요청을 통해 얻은 JSON 타입의 Response 메세지 읽어오기
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
String result = "";
while ((line = br.readLine()) != null) {
result += line;
}
// Gson 라이브러리에 포함된 클래스로 JSON 파싱
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result);
accessToken = element.getAsJsonObject().get("access_token").getAsString();
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
return accessToken;
}
Step 5: 사용자 정보 조회 (로그인 처리의 핵심)
발급받은 Access Token을 사용하여 카카오 서버에 사용자 정보를 요청합니다. 이 정보를 바탕으로 DB 조회 후 회원가입 또는 로그인을 완료합니다.
Service 로직 예제
public HashMap<String, Object> getUserInfo(String accessToken) {
HashMap<String, Object> userInfo = new HashMap<>();
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();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
String result = "";
while ((line = br.readLine()) != null) {
result += line;
}
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result);
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();
userInfo.put("nickname", nickname);
userInfo.put("email", email);
} catch (IOException e) {
e.printStackTrace();
}
return userInfo;
}
Step 6: 통합 컨트롤러 구성
앞서 만든 로직들을 연결하여 최종적인 콜백 처리를 수행합니다.
@Controller
public class KakaoController {
@Autowired
private KakaoService kakaoService;
@RequestMapping(value="/login/kakao")
public String login(@RequestParam("code") String code, HttpSession session) {
// 1. 인가 코드로 토큰 받기
String accessToken = kakaoService.getAccessToken(code);
// 2. 토큰으로 사용자 정보 조회
HashMap<String, Object> userInfo = kakaoService.getUserInfo(accessToken);
System.out.println("login info : " + userInfo.get("email"));
// 3. 세션에 저장하거나 자체 DB 로직 처리
if (userInfo.get("email") != null) {
session.setAttribute("userId", userInfo.get("email"));
session.setAttribute("access_token", accessToken);
}
return "index"; // 로그인 성공 후 메인 페이지로 이동
}
}
요약 및 주의사항
- 인가 코드 소모: 인가 코드는 1회용입니다. 토큰 요청에 한 번 사용하면 폐기되므로 재사용이 불가능합니다.
- 보안: REST API 키와 Client Secret은 절대 클라이언트 측(JS)에 노출되어서는 안 되며, 서버 환경 변수로 관리하는 것이 안전합니다.
- 토큰 유효기간: 액세스 토큰은 만료 시간이 있습니다. 장기적인 연동이 필요하다면 refresh_token을 사용하여 토큰을 갱신하는 로직을 추가해야 합니다.
- 에러 핸들링: 카카오 API 응답 코드가 200이 아닌 경우(401, 403 등)에 대한 예외 처리를 반드시 구현해야 서비스의 안정성이 보장됩니다.
이 과정을 통해 Java 환경에서 카카오 REST API를 이용한 기본적인 소셜 로그인 시스템을 구축할 수 있습니다.
#Java #카카오로그인 #KakaoLogin #RESTAPI #스프링부트 #SpringBoot #OAuth2 #백엔드개발 #API연동 #소셜로그인구현
'API' 카테고리의 다른 글
| Google Maps API 구글 지도 API 연동 - 5. 커스터마이징 (0) | 2026.05.14 |
|---|---|
| Google Maps API 구글 지도 API 연동 - 4. 클러스터링 (0) | 2026.05.14 |
| Google Maps API 구글 지도 API 연동 - 3. 장소 (0) | 2026.05.14 |
| Google Maps API 구글 지도 API 연동 - 2. 길찾기 (0) | 2026.05.14 |
| Google Maps API 구글 지도 API 연동 - 1. 시작하기 (0) | 2026.05.14 |
| 카카오 지도 연동하기 (0) | 2026.05.10 |
- Total
- Today
- Yesterday
- html
- Java
- OpenCV
- C++
- c#
- 벡터
- 아두이노
- 클래스
- 데이터베이스
- 문제풀이
- 파일처리
- DB연동
- 상속
- MySQL
- 정보처리기사
- C++ 클래스
- 문자열
- C언어
- Android
- 파이썬
- 안드로이드
- C
- 자바
- 블루투스
- 배열
- 리스트
- 자료구조
- Class
- String
- 알고리즘
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
