[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;
    }
}

'Spring > ์—๋Ÿฌ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring] - Request Entity Too Large  (2) 2023.09.10
[Spring] - SpringActionTagProcessor  (0) 2023.09.10
[Spring] - Entity Manager Factory ์—๋Ÿฌ  (0) 2023.09.10
[Spring] - SimpleMailMessage ์—๋Ÿฌ  (0) 2023.09.10
[Spring] - @SpringBootTest ์—๋Ÿฌ  (0) 2023.09.10