24.02.26

서린·2024년 2월 26일

혼자개발

목록 보기
54/82

로그아웃이 되지 않아 코드를 수정했다
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 엔드포인트로 돌아와서 무한하게 반복되기 때문 같았다

0개의 댓글