블로그 프로젝트의 카카오 로그인 기능은 사용자가 처음 카카오 로그인을 진행하면 자동으로 회원가입이 진행됩니다. 이때 개발자가 정해놓은 정적인 유니크 키에 의해 비밀번호가 저장되는데, 이런 로직은 서비스 상 문제가 발생할 수 있습니다.

1. 유니크 키 유출 문제

유니크 키가 유출될 경우, 카카오 로그인을 사용하는 모든 사용자의 계정이 위험해집니다. 유니크 키가 유출된다면, 해당 키를 알고 있는 사용자는 모든 카카오 로그인 사용자의 계정에 로그인할 수 있습니다.

2. 비밀번호 변경 문제

카카오 로그인 사용자가 비밀번호를 수정한 이후에 다시 로그인하면, 블로그 프로젝트 로직상으로는 정상적인 스프링 시큐리티 로그인이 불가능합니다. 이 문제를 해결하려면, 카카오 로그인(OAuth를 이용한 로그인) 사용자가 비밀번호를 변경할 수 없도록 설정해주는 것이 좋습니다.

이를 위해 User 테이블에 oauth 컬럼을 추가해 주었습니다. oauth 컬럼은 해당 사용자가 카카오, 구글 등 oauth 로그인 사용자인지, 일반 사용자인지의 데이터를 가집니다.

아래의 코드처럼 스프링 시큐리티 로그인 정보의 oauth 데이터를 통하여 비밀번호 수정의 가능 여부를 결정하게 서비스를 수정하였습니다.

<div th:if="${#authentication.principal.user.oauth == null}" 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 th:if="${#authentication.principal.user.oauth == null}" 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>

        <div th:unless="${#authentication.principal.user.oauth == null}" class="mb-3 mt-3">
            <label for="email" class="form-label">Email:</label>
            <input type="email" class="form-control" 
									 th:value="${#authentication.principal.user.email}" 
									 placeholder="Enter email" name="email" readonly>
        </div>
@Transactional
public void update(User requestUser) {
    User persistenceUser = userRepository.findById(requestUser.getId()).orElseThrow(
				() -> {throw new IllegalArgumentException("회원수정 실패: 회원 정보가 존재하지 않습니다.");
    });

    //validate 체크
    if (persistenceUser.getOauth() == null || persistenceUser.getOauth().equals("")) {
        persistenceUser.setPassword(encoder.encode(requestUser.getPassword()));
				persistenceUser.setEmail(requestUser.getEmail());
    }
}