스프링시큐리티 환경에서 회원 정보 수정 기능을 구현하던 중

회원 정보 수정을 완료하고 DB에 최신 데이터가 반영되었음에도 회원 정보페이지에 다시 접속하면 수정하기 전의 정보가 출력되는 현상이 발생하였습니다.

변경할 회원 정보를 입력하고 회원정보 수정 버튼을 클릭 시 정상 알림창이 출력되고

Untitled

Untitled

DB에도 정상적으로 수정된 정보가 반영된 것을 확인할 수 있습니다.

하지만,, 변경 후 다시 회원 정보를 요청하면

Untitled

수정하기 전의 정보가 출력되는데

첫 번째 해결 방법

이는 현재의 코드가 아래 예시 처럼 스프링 시큐리티 세션의 정보를 #authentication.principal로 가져와 사용자에게 출력하는 구조이기 때문에 일어나는 현상이었습니다.

<form>
    <div class="mb-3 mt-3">
        <label for="username" class="form-label">UserName:</label>
        <input type="text" class="form-control" id="username" 
							 th:value="${#authentication.principal.user.username}" 
						   name="username" readonly>
    </div>

    <div class="mb-3">
        <label for="password" class="form-label">Password:</label>
        <input type="text" class="form-control" id="password" 
							 placeholder="Enter password" name="password">
    </div>

    <div class="mb-3 mt-3">
        <label for="email" class="form-label">Email:</label>
        <input type="email" class="form-control" id="email" 
							 th:value="${#authentication.principal.user.email}"
							 placeholder="Enter email" name="email">
    </div>
</form>

DB의 데이터가 정상적으로 변경이 되었더라도 스프링 시큐리티의 세션의 정보는 변경되지 않고, 재 로그인 시 최신 정보로 변경되게 됩니다. 따라서 정보 변경 이전의 데이터가 출력되는 것입니다.

해당 문제를 해결하기 위해 사용자가 회원정보 폼을 요청할 시 회원 정보를 DB에서 Select한 이후 model에 담아 최신화된 정보를 출력할 수 있도록 변경하였습니다.

@GetMapping("/user/updateForm")
public String updateForm(Authentication authentication, Model model){
    UserDetails userDetails = (UserDetails) authentication.getPrincipal();
    model.addAttribute("userInfo", userService.findByName(userDetails.getUsername()));
    return "user/updateForm";
}

컨트롤러에서 스프링시큐리티의 로그인 정보를 바탕으로 DBUser 정보를 Select 해줍니다.