카카오 로그인
카카오 로그인 과정
https://developers.kakao.com/docs/latest/ko/kakaologin/js#before-you-begin-process
카카오 로그인 데모
그대로 복사해서 jsp 파일에 body 태그 안에 넣으면 된다.
<script src="https://t1.kakaocdn.net/kakao_js_sdk/2.7.4/kakao.min.js"
integrity="sha384-DKYJZ8NLiK8MN4/C5P2dtSmLQ4KwPaoqAfyA/DfmEc1VDxu4yyC7wy6K1Hs90nka" crossorigin="anonymous"></script>
<script>
Kakao.init('c089c8172def97eb00c07217cae17495'); // 사용하려는 앱의 JavaScript 키 입력
</script>
<a id="kakao-login-btn" href="javascript:loginWithKakao()">
<img src="https://k.kakaocdn.net/14/dn/btroDszwNrM/I6efHub1SN5KCJqLm1Ovx1/o.jpg" width="222"
alt="카카오 로그인 버튼" />
</a>
<p id="token-result"></p>
<script>
function loginWithKakao() {
Kakao.Auth.authorize({
redirectUri: 'https://developers.kakao.com/tool/demo/oauth',
});
}
// 아래는 데모를 위한 UI 코드입니다.
displayToken()
function displayToken() {
var token = getCookie('authorize-access-token');
if(token) {
Kakao.Auth.setAccessToken(token);
Kakao.Auth.getStatusInfo()
.then(function(res) {
if (res.status === 'connected') {
document.getElementById('token-result').innerText
= 'login success, token: ' + Kakao.Auth.getAccessToken();
}
})
.catch(function(err) {
Kakao.Auth.setAccessToken(null);
});
}
}
function getCookie(name) {
var parts = document.cookie.split(name + '=');
if (parts.length === 2) { return parts[1].split(';')[0]; }
}
</script>
Step 1: 간편 로그인
애플리케이션 추가하기
내 애플리케이션 -> 애플리케이션 추가하기
앱 이름, 회사명, 카테고리를 입력한 다음 아래 체크박스 체크 후 저장
카카오 로그인 활성화 설정
카카오 로그인이 꺼져있기 때문에 내 애플리케이션 -> 대시보드 -> 설정하기 클릭
카카오 로그인 ON으로 바꾸기
앱 키 등록
내 애플리케이션 -> 앱 키
앱 키를 보면 4가지의 앱 키가 있다.
여기서 JavaScript 키 복사
jsp에 script 태그 안에 있는 코드에 JavaScript 키를 붙여넣는다.
<script>
Kakao.init('1711~~~'); // 앱 키 붙여넣기
</script>
카카오 로그인 동의항목 설정
내 애플리케이션 -> 카카오 로그인 -> 동의항목
여기서 개인 정보 동의 항목을 설정할 수 있다.
일단 닉네임만 받아올 것이기 때문에 닉네임 오른쪽에 설정 클릭
필수 동의 체크 후 동의 목적 입력
저장하기!
입력하고 저장하면 상태에 '필수 동의'가 떠있는 걸 확인할 수 있다.
Redircet URI
우리 서버의 주소를 등록해놓고 카카오가 이 주소로 응답을 보내게 설정
내 애플리케이션 -> 카카오 로그인 -> Redirect URI
IP 주소 + 요청 받을 url을 입력한다.
js 코드에서도 같은 url 값을 넣어준다.
KakaoController.java
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/kakao/*")
public class KakaoController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getPathInfo();
if("/code".equals(action)) {
System.out.println("카카오가 코드를 보냈다");
System.out.println(req.getParameter("code"));
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getPathInfo();
}
}
로그인을 하면 Redirect URI로 code 값을 넣어서 보내준다.
IntelliJ에서도 출력이 잘 된다.
Step 2: 토큰 받기
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#request-token
전체 코드
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getPathInfo();
if ("/code".equals(action)) {
System.out.println("카카오가 코드를 보내줬다.");
// 인가 코드
String code = req.getParameter("code");
System.out.println(code);
// 인가 코드로 토큰 발급 요청 (HTTP POST로 https://kauth.kakao.com/oauth/token 에 요청 보내기)
try {
// HttpClient 생성
HttpClient client = HttpClient.newHttpClient();
String formData = String.format(
"grant_type=authorization_code&client_id=내 REST API 키&redirect_uri=설정해준 Redirect URI&code=%s",
URLEncoder.encode(code, StandardCharsets.UTF_8)
);
// HttpRequest 생성
HttpRequest httpRequest = HttpRequest.newBuilder()
.uri(URI.create("https://kauth.kakao.com/oauth/token"))
.header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
.POST(HttpRequest.BodyPublishers.ofString(formData))
.build();
// 요청 보내고 응답 받기
HttpResponse<String> httpResponse = client.send(httpRequest, HttpResponse.BodyHandlers.ofString());
// 응답 출력
System.out.println("Response Code: " + httpResponse.statusCode());
System.out.println("Response Body: " + httpResponse.body());
} catch (Exception e) {
e.printStackTrace();
}
}
}
요청
필수로 나와있는 4가지를 같이 넣어서 요청을 보내야 한다.
HttpClient 생성
필수로 넣어야 되는 내용들을 String 변수에 만들어준다.
grant_type은 authorization_code로 고정이니까 그대로 적어주고,
client_id는 앱의 REST API 키를 복사해서 적어준다.
redirect_uri은 아까 설정해준 Redirect URI를 복사해서 적어주고,
code는 파라미터로 받은 응답 코드를 req.getParameter("code")로 가져와서 넣어준다.
// HttpClient 생성
HttpClient client = HttpClient.newHttpClient();
String formData = String.format(
"grant_type=authorization_code&client_id=내 REST API 키&redirect_uri=설정해준 Redirect URI&code=%s",
URLEncoder.encode(code, StandardCharsets.UTF_8)
);
HttpRequest 생성
헤더에 필수로 들어가야 되는 헤더를 넣어주고,
본문으로 아까 만든 String 변수를 넣어준다.
// HttpRequest 생성
HttpRequest httpRequest = HttpRequest.newBuilder()
.uri(URI.create("https://kauth.kakao.com/oauth/token"))
.header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
.POST(HttpRequest.BodyPublishers.ofString(formData))
.build();
요청 보내고 응답 받기
카카오에게 요청을 보내고 응답을 받는다.
// 요청 보내고 응답 받기
HttpResponse<String> httpResponse = client.send(httpRequest, HttpResponse.BodyHandlers.ofString());
응답 출력
// 응답 출력
System.out.println("Response Code: " + httpResponse.statusCode());
System.out.println("Response Body: " + httpResponse.body());
Step 3: 사용자 로그인 처리
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#req-user-info
발급 받은 토큰으로 사용자 정보를 조회하고, 서비스 회원 정보를 확인하거나 가입 처리를 한다.
전체 코드
// acces_token 뽑아내기 (문자열 파싱)
String accessToken = httpResponse.body().split("\"access_token\":\"")[1].split("\"")[0];
HttpRequest userHttpRequest = HttpRequest.newBuilder()
.uri(URI.create("https://kapi.kakao.com/v2/user/me"))
.header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
.header("Authorization", "Bearer " + accessToken)
.POST(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> userHttpResponse = client.send(userHttpRequest, HttpResponse.BodyHandlers.ofString());
System.out.println("Response Code: " + userHttpResponse.statusCode());
System.out.println("Response Body: " + userHttpResponse.body());
토큰 뽑아내기 (문자열 파싱)
access_token 값만 뽑아내서 변수에 저장해준다.
// acces_token 뽑아내기 (문자열 파싱)
String accessToken = httpResponse.body().split("\"access_token\":\"")[1].split("\"")[0];
요청 생성
사용자 정보를 가져오기 위한 요청을 생성한다.
카카오 문서에 나와있는 대로 요청 URL과 헤더를 작성해준다.
HttpRequest userHttpRequest = HttpRequest.newBuilder()
.uri(URI.create("https://kapi.kakao.com/v2/user/me"))
.header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
.header("Authorization", "Bearer " + accessToken)
.GET()
.build();
요청 보내고 응답 받기
카카오 서버에게 요청을 보내고 응답을 받는다.
HttpResponse<String> userHttpResponse = client.send(userHttpRequest, HttpResponse.BodyHandlers.ofString());
응답 출력
받은 응답을 출력해준다.
System.out.println("Response Code: " + userHttpResponse.statusCode());
System.out.println("Response Body: " + userHttpResponse.body());
'BE > Java' 카테고리의 다른 글
[Java] DTO 설계 시 고려사항 (0) | 2025.01.10 |
---|---|
[Java] multipart/form-data란? / form 태그로 서버에 파일 전달하기 (0) | 2025.01.09 |
[Java] SQL Injection, PreparedStatement (2) | 2025.01.09 |
[Java] Servlet 프로젝트 구조 / 로그인, 회원가입 기능 구현 (0) | 2025.01.08 |
[Java] IntelliJ + MariaDB 연동, SQL 실행 (0) | 2025.01.08 |