Springboot를 이용하여 블로그를 만드는 클론 코딩을 진행하던 중, 오류가 발생하여 정리해 본다.
현재 기본적인 틀은 구성이 된 상태이며, 카카오 API를 이용하여 권한까지 발급 받아 유저 정보까지는 return 받은 상태이다.
이를 이용하여 받은 정보로 가입 여부를 확인 하고, 비가입자면 회원가입 로직을 태운 후, 로그인 처리를 하는 로직을 구성 중이다.
듣고있는 강의에서는 UsernamePasswordAuthenticationToken을 이용하여 authentication 객체를 생성하고 SecurityContextHolder에서 현재 context를 가져와 set 해주는 방법으로 현재 세션에 바로 등록되도록 하였다.
User kakaoUser = User.builder()
.username(kakaoProfile.getKakao_account().getEmail() + "_" + kakaoProfile.getId())
.password(cosKey)
.email(kakaoProfile.getKakao_account().getEmail()).build();
//가입 유저 확인
User originUser = userService.findUser(kakaoUser.getUsername());
//미가입자면 회원 가입
if(originUser.getUsername() == null){
System.out.println("기존 회원이 아닙니다.");
userService.join(kakaoUser);
}
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(kakaoUser.getUsername(), password));
SecurityContextHolder.getContext().setAuthentication(authentication);
이 방법은 원래 로그인 한 유저의 정보수정을 할 때 사용한 로직인데, Session에 있는 유저정보를 가져와 수정하는 코드이다. (왜 강의에서 이 방법을 사용했는지는 설명이 없어서 잘 이해가 되지 않았다...)
이렇게 연결을 하면 header.jsp에서 jstl을 이용하여 authentication에 있는 principal 객체를 가져와 접속을 하였는지 여부를 판단, 네비게이션을 바꾸는 형태이다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix = "sec" uri = "http://www.springframework.org/security/tags"%>
<sec:authorize access="isAuthenticated()">
<sec:authentication property="principal" var="principal"/>
</sec:authorize>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
<!-- 썸머노트 스크립트 -->
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.css"rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.js"></script>
</head>
<body>
<nav class="navbar navbar-expand-md bg-dark navbar-dark">
<a class="navbar-brand" href="/">Home</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<p>"${principal}"</p>
<c:choose>
<c:when test="${empty principal}">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="/auth/loginForm">로그인</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/auth/joinForm">회원가입</a>
</li>
</ul>
</c:when>
<c:otherwise>
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="/board/saveForm">글쓰기</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/user/updateForm">회원정보</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/logout">로그아웃</a>
</li>
</ul>
</c:otherwise>
</c:choose>
</div>
</nav>
<br />
그런데 실제로 실행시켜보니 카카오 로그인시 계속 로그인 화면으로 돌아오는 것을 확인했다.
처음에는 로직에 오류로 접속이 안되는 줄 알았는데, console로 찍어보니 실제 로직 동작은 다 되는 것으로 확인이 되었다.
문제를 계속 찾아보니, 일반 로그인 시에는 SecurityConfig로 정의된 로그인 url로 접근을 하게 되므로 session이 정상적으로 할당 되는 것을 확인 하였는데, 카카오 로그인 시에는 이것이 아닌 authentication에 바로 값을 넣어주어므로 정상적으로 session이 생성되지 않는다고 추측하였다.
그래서 이것저것 실험해보다가 카카오 로그인시 마지막에 redirect 할때 index 페이지가 아닌 유저정보 폼으로 보내도록 해보았는데, 이렇게 작동시키니 정상적으로 username과 password가 들어오는 것을 확인하였다.
그런데 문제는 정보 수정을 누르니 다시 session이 날아가버려 로그인 페이지로 연결 되는 것.
이것저것 추적해 보다가, authencation의 details를 찍어보았는데 카카오 로그인 시에는 details가 null로 들어와 있는 것을 확인하였다.
details가 어떻게 구성되고 위의 현상과 무슨 관련이 있는지 좀더 공부가 필요할 것 같다...
'SpringBoot' 카테고리의 다른 글
Spring/Spring 기본(Spring 강의 정리) Spring 핵심 원리 - 프로젝트 환경 설정 (1) | 2023.11.24 |
---|