로그아웃이 되지 않아 코드를 수정했다
LogoutController.java
@Controller
public class LogoutController {
@RequestMapping(value = "/kakao/logout", method = RequestMethod.GET)
public String logout(HttpSession session) {
// 카카오와 함께 로그아웃하는 URL
String logoutUrl = "https://kauth.kakao.com/oauth/logout";
// 카카오 애플리케이션의 REST API 키
String clientId = "1f9ba236274cc877d8d549827331eb10";
// 서비스의 로그아웃 Redirect URI
String redirectUri = "http://localhost:8080/kakao/logout";
// GET 요청에 필요한 파라미터 설정 및 URL 인코딩
try {
clientId = URLEncoder.encode(clientId, "UTF-8");
redirectUri = URLEncoder.encode(redirectUri, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// GET 요청에 필요한 파라미터 설정
String params = "?client_id=" + clientId + "&logout_redirect_uri=" + redirectUri;
// RestTemplate을 이용한 GET 요청
RestTemplate restTemplate = new RestTemplate();
// 요청 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
// 요청 엔티티 생성
HttpEntity<String> entity = new HttpEntity<>(headers);
// RestTemplate을 사용하여 GET 요청 보내기
ResponseEntity<String> response = restTemplate.exchange(logoutUrl + params, HttpMethod.GET, entity, String.class);
System.out.println(response);
// 세션 무효화
session.invalidate();
return "redirect:/user/sign-in-view";
}
}
이렇게 세션 무효화를 추가하니 로그아웃이 정상적으로 실행됐다
하지만 '카카오계정과 함께 로그아웃'이 아니라 '로그아웃'으로 실행이 되고있었다
내가 구현 하고싶은 건 카카오계정과 함께 로그아웃인데..
다시 수정했다
@Controller
public class LogoutController {
@RequestMapping(value = "/kakao/logout", method = RequestMethod.GET)
public String logout() {
// 카카오와 함께 로그아웃하는 URL
String logoutUrl = "https://kauth.kakao.com/oauth/logout";
// 카카오 애플리케이션의 REST API 키
String clientId = "1f9ba236274cc877d8d549827331eb10";
// 서비스의 로그아웃 Redirect URI
String redirectUri = "http://localhost:8080/kakao/logout";
// GET 요청에 필요한 파라미터 설정 및 URL 인코딩
try {
clientId = URLEncoder.encode(clientId, "UTF-8");
redirectUri = URLEncoder.encode(redirectUri, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// GET 요청에 필요한 파라미터 설정
String params = "?client_id=" + clientId + "&logout_redirect_uri=" + redirectUri;
// RestTemplate을 이용한 GET 요청
RestTemplate restTemplate = new RestTemplate();
// 요청 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
// 요청 엔티티 생성
HttpEntity<String> entity = new HttpEntity<>(headers);
// RestTemplate을 사용하여 GET 요청 보내기
restTemplate.exchange(logoutUrl + params, HttpMethod.GET, entity, String.class);
// 카카오에서 제공하는 Redirect URI로 서비스 측으로 리디렉션
return "redirect:" + logoutUrl + params;
}
// 카카오에서 제공하는 Redirect URI로 요청이 들어왔을 때의 처리
@RequestMapping(value = "/kakao/logout/redirect", method = RequestMethod.GET)
public String logoutRedirect(HttpSession session) {
// 서비스 측에서는 해당 Redirect URI로 요청이 들어왔을 때, 사용자의 세션을 무효화하고 원하는 작업을 수행
session.invalidate();
return "redirect:/user/sign-in-view";
}
}
/kakao/logout 엔드포인트를 통해 카카오 세션을 만료시키고,
그 후에 카카오에서 제공하는 Redirect URI로 리디렉션하여
서비스 측에서 해당 Redirect URI로 요청이 들어왔을 때, 사용자의 세션을 무효화하는 작업을 수행하도록
logoutRedirect 메소드를 추가해줬다
실행했더니..

이 화면이 떴고
카카오 계정과 함께 로그아웃 버튼을 누르니

처음보는 에러...!
검색해봤더니
무한 redirect loop가 발생한거라고 한다
redirect 처리과정에서 끝없는 redirect 요청이 발생해 서버가 처리하지 못하고 있다는 건데
내 코드에서는 로그아웃 처리 후 카카오에서 제공하는 Redirect URI로 리디렉션하고 있고 이 리디렉션 요청이 다시 /kakao/logout 엔드포인트로 돌아와서 무한하게 반복되기 때문 같았다