본문 바로가기

프로젝트 & TIL/일별 공부 기록 (백엔드 스쿨)

38일차 - 프로젝트 진행 시 참고 사항, PasswordEncoder

* 깃 merge 후에 터미널에서 입력해야 할 명령어

git branch -D 브랜치_이름
git fetch --prune

git branch -D ~ : 브랜치 삭제(깃허브 웹사이트에서도 Delete Branch 해주기!!!)

git fetch : 원격 저장소의 최신 메타데이터 정보 확인

git fetch --prune : 원격 저장소에서 로컬로 데이터를 가져올 때 로컬 저장소에 없는 브랜치 및 태그를 제거

* git prune : 로컬 저장소에서 사용되지 않는 Git 객체(커밋, 트리, 블롭 등)를 제거

 


* DB 데이터 접근 방법

단순한 쿼리 : JPA 함수

복잡한 쿼리 :

- JPA 반복 호출

- JPQL => QueryDSL(권장)

- @Query(~SQL문~)


PasswordEncoder를 이용한 비밀번호 테스트

❌ 잘못된 방법 ❌

        // member 생성 -> id : user1, 비밀번호 : 1234
        Member member = memberService.create("user1", "1234");

        // member의 비밀번호를 1111로 변경
        memberService.modify(member, "1111");

        // 1111을 encode한 값인 password와 member.getPassword() 값 비교
        String password = passwordEncoder.encode("1111");
        assertThat(member.getPassword()).isEqualTo(password);

  

⭕ 올바른 방법 ⭕

        // member 생성 -> id : user1, 비밀번호 : 1234
        Member member = memberService.create("user1", "1234");

        // member의 비밀번호를 1111로 변경
        memberService.modify(member, "1111");

        // "1111"과 member.getPassword() 의 값이 같다면 True
        assertThat(passwordEncoder.matches("1111", member.getPassword())).isTrue();

  

PasswordEncoder는 비밀번호를 해시 함수에 전달하여 해시 값을 생성한다. 일반적으로 안전한 암호화를 위해 PBKDF2, Bcrypt, Scrypt, Argon2와 같은 안전한 일방향 해시 함수가 사용되는데, 이러한 함수는 비밀번호를 암호화할 때 솔트(salt)라는 임의의 값을 사용하여 보안성을 높이기도 한다.

===> 즉, 같은 값을 인코딩하더라도 임의의 값인 솔트에 의해 각기 다른 해시 값이 생성된다. 따라서 위와 같이 '잘못된 방법'으로는 같은 비밀번호인지 검증할 수 없다.

===> PasswordEncoder가 제공하는 matches()를 이용하면 암호화가 되지 않은 raw 값과 암호화된 값이 서로 같은지 검증할 수 있다.