๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ณด์•ˆ

Bcrypt ์ธ์ฝ”๋”ฉ

Bcrypt ์ธ์ฝ”๋”ฉ

Bcrypt์˜ ์•”ํ˜ธํ™” ๋ฐฉ์‹์„ ์•Œ์•„๋ณด๊ณ  ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋กœ Bcrypt ์ธ์ฝ”๋”ฉ์„ ์ ์šฉํ•ด๋ณด์ž.

Bcrypt ์•”ํ˜ธํ™” ๋ฐฉ์‹

  • Bcrpyt๋Š” ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ์•”ํ˜ธํ™”์ด๋‹ค.
  • ๋‹จ๋ฐฉํ–ฅ์ด๊ธฐ ๋•Œ๋ฌธ์— Bcrypt ์ธ์ฝ”๋”ฉ ๋œ ์•”ํ˜ธ๋Š” ๋ณตํ˜ธํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž์ฒด๋งŒ ํ•ด์‹œ ํ•จ์ˆ˜๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ•˜๋ฉด ํ‰๋ฌธ๋“ค์„ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋น„๊ตํ•ด๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Bcrypt๋Š” ์•”ํ˜ธํ™” ๊ณผ์ •์—์„œ salt(์ž„์˜์˜ ์ฒจ๊ฐ€ ๋ฌธ์ž์—ด)๋ฅผ ์ด์šฉํ•œ๋‹ค.
ex) ๋น„๋ฐ€๋ฒˆํ˜ธ : "1234"
์•”ํ˜ธํ™”("1234" , salt) == ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด
  • ํ‰๋ฌธ์œผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์กฐํšŒ๋ฅผ ์œ„ํ•ด salt ๋ฌธ์ž์—ด์„ ์•Œ ํ•„์š”๋Š” ์—†๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ ๋•Œ๋ฌธ์ด๋‹ค.
์•”ํ˜ธํ™”("1234" , ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด) == ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด
  • ์ฆ‰, ๊ธฐ์กด์˜ ์•”ํ˜ธํ™”๋ฅผ ํ–ˆ๋˜ ํ‰๋ฌธ๊ณผ ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด์„ Bcrypt Encode ํ•œ๋‹ค๋ฉด ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์€ ๋ฌธ์ž์—ด์ด ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ๋‹ค.

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋กœ ๊ตฌํ˜„

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ๋Š” PasswordEncoderFactories๋กœ Bcrypt Encoding ๊ตฌํ˜„์„ ์ œ๊ณตํ•ด ์ฃผ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค์Œ๊ณผ ๊ฐ™์ด @Bean์„ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    @Bean
    public PasswordEncoder passwordEncoder(){
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

์ฐธ๊ณ ๋กœ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ Bcrypt Encoding์€ ๋ณด์•ˆ์„ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ Encoding ์‹œ๊ฐ„์„ ์‚ด์ง ๋Šฆ์ถฐ์„œ ์งง์€ ์‹œ๊ฐ„ ๋™์•ˆ ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์•”ํ˜ธํ™” ์‹œ๋„๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.


๊ฐ€์ž…ํ•˜๋Š” ๊ณ„์ •์— ๋Œ€ํ•œ Dto๋ฅผ ๋ฐ›์•„์„œ ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด Encoding ํ•  ์ˆ˜ ์žˆ๋‹ค.

Account account = Account.builder()
                .nickname(dto.getNickname())
                .email(dto.getEmail())
                .password(passwordEncoder.encode(dto.getPassword()))
                .role(Role.ROLE_USER)
                .build();

        accountRepository.save(account);

.password(passwordEncoder.encode(dto.getPassword()))๋กœ Bcrpyt Encoding ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ DB์— ๋„ฃ์–ด์ค€๋‹ค.

Test Code

๊ธฐ์กด์˜ ํ‰๋ฌธ๊ณผ DB์— ์ €์žฅ๋œ ํŒจ์Šค์›Œ๋“œ ๊ฐ’์ด ๋‹ค๋ฅธ์ง€ ํ…Œ์ŠคํŠธํ•ด๋ณด์ž.

  @DisplayName("ํŒจ์Šค์›Œ๋“œ ์ธ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ")
  @Test
  public void password_enc_test() throws Exception{
      //when
      SignupDto signupDto = SignupDto.builder()
              .nickname("testUser")
              .password("12345678")
              .email("testUser@test.com")
              .build();

      //given
      mockMvc.perform(post("/sign-up")
              .content(objectMapper.writeValueAsString(signupDto))
              .contentType(MediaType.APPLICATION_JSON));

      Account account = accountRepository.findByEmail("testUser@test.com");

      //then
      Assertions.assertNotEquals(account.getPassword(),"12345678");
    }

ํ‰๋ฌธ์ธ "12345678"๊ณผ DB์— ์ €์žฅ๋œ ํ‰๋ฌธ์„ ์•”ํ˜ธํ™” ํ•œ ๊ฐ’์€ ๋‹ค๋ฅด๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ต๊ณผํ•œ๋‹ค.

'๋ณด์•ˆ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ฟ ํ‚ค-์„ธ์…˜, JWT ํ† ํฐ ์ธ์ฆ  (0) 2022.03.17
์•”ํ˜ธํ™” ํ•ด์‹œ ํ•จ์ˆ˜  (0) 2022.03.13
A5/1 แ„€แ…ฎแ„’แ…งแ†ซ(C++)  (0) 2022.03.13