[Spring] - PasswordEncoder μ—λŸ¬

πŸ’¬ 상황 μ„€λͺ…

λΉ„λ°€λ²ˆν˜Έ λ³€κ²½ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ˜ 쀑 μ•„λž˜μ™€ 같은 μ—λŸ¬ ꡬ문을 ν™•μΈν–ˆλ‹€. log도 없이 λ‹¨μˆœνžˆ μ•„λž˜ ꡬ문만 뜬게 μ΄μƒν•˜μ—¬ Bean 등둝이 μ œλŒ€λ‘œ λ˜μ–΄μžˆλŠ”μ§€, λ‘œμ§μ—λŠ” λ¬Έμ œκ°€ μ—†λŠ”μ§€ 확인을 ν–ˆμ§€λ§Œ μ•„λ¬΄λŸ° λ¬Έμ œκ°€ μ—†μ—ˆλ‹€.

Empty encoded password

πŸ›  κ΅¬ν˜„ μ½”λ“œ

public class MemberController {
    @PostMapping("...")
    public String doModifyPassword(ModifyPasswordDto dto, 
                                   @AuthenticationPrincipal MemberContext context){
        if(checkMatchPassword(context.getMember().getUsername(), dto.getOldPassword())){
            ...
        }
    }
}

public class MemberService{
    @Transactional(readOnly = true)
    public boolean checkMatchPassword(String username, String oldPassword) {
        return passwordEncoder.matches(oldPassword, member.getPassword());
    }
}

πŸ”Ž 원인 뢄석

문제λ₯Ό μ’ν˜€κ°€λ©° λ‘œκΉ…μ„ μ§„ν–‰ν•˜μ˜€κ³ , MemberContext의 getPassword()μ—μ„œ null값이 μ°νžˆλŠ” 것을 ν™•μΈν•˜μ˜€κ³ , κ²€μƒ‰ν•΄λ³΄λ‹ˆ μ•„λž˜μ™€ 같은 글을 확인할 수 μžˆμ—ˆλ‹€.

Spring SecurityλŠ” 인증을 μˆ˜ν–‰ν•˜λ©΄ Authentication κ°μ²΄μ—μ„œ μ•”ν˜Έλ₯Ό μ§€μš°λŠ” 과정을 μˆ˜ν–‰ν•œλ‹€.

즉, @AuthenticationPrincipal μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄ κ°€μ Έμ˜¨ getMember().getPassword()κ°€ null이 μ°νžˆλŠ” μ΄μœ λŠ” Spring Securityμ—μ„œ 인증을 μ™„λ£Œν•΄μ„œ passwordλ₯Ό 날렀버린 것이닀.

βœ… ν•΄κ²° κ³Όμ •

SecurityConfigλ₯Ό 톡해 ν•΄κ²°ν•˜λ©΄ 인증 후에도 passwordκ°€ μ§€μ›Œμ§€μ§€ μ•Šμ•„ JWT 연동 μ‹œ λ³΄μ•ˆμ— μ·¨μ•½ν•΄μ§ˆ 수 μžˆλ‹€. λ•Œλ¬Έμ— MemberContext의 username을 ν™œμš©ν•΄μ„œ λ‹€μ‹œ μ°Ύμ•„μ˜€λŠ” λ°©μ•ˆμœΌλ‘œ μˆ˜μ •ν–ˆλ‹€.

public class MemberService {
    // λ ˆκ±°μ‹œ μ½”λ“œ
    @Transactional(readOnly = true)
    public boolean checkMatchPassword(Member member, String oldPassword) {
        return passwordEncoder.matches(oldPassword, member.getPassword());
    }

    // κ°œμ„  μ½”λ“œ
    @Transactional(readOnly = true)
    public boolean checkMatchPassword(String username, String oldPassword) {
        Member currentMember = memberRepository.findByUsername(username).orElse(null);
        if (currentMember != null) {
            return passwordEncoder.matches(oldPassword, currentMember.getPassword());
        }
        return false;
    }
}

javaκ°œλ°œμžλ‹˜ λΈ”λ‘œκ·Έ
johnna_endureλ‹˜ λΈ”λ‘œκ·Έ

λŒ“κΈ€λ‚¨κΈ°κΈ°