728x90
null 검증
resultActions.andExpect(jsonPath("$.success").value("true"));
//resultActions.andExpect(jsonPath("$.response").value("null")); //에러
resultActions.andExpect(jsonPath("$.response").doesNotExist()); //null인지 확인
null
인지 검증하기 위해서는 value로 검증하지 않고 doesNotExist()
로 검증한다.
[ ] 빈 리스트 검증
resultActions2.andExpect(jsonPath("$.response.products.length()").value(0)); //빈 리스트 검증
resultActions2.andExpect(jsonPath("$.response.totalPrice").value(0));
빈 리스트 검증은 길이(length)가 0
으로 검증한다.
비밀번호 해시값 비교
fake DB
INSERT INTO user_tb (`id`,`email`,`password`,`username`, `roles`) VALUES ('2', 'user1@nate.com', '{bcrypt}$2a$10$nfm1CxFC6mYT2zivOTJUNedyfMRFImsQKmqw2Tl6llK4mTAl0wq8y', 'user1mango', 'ROLE_USER');
service (검증 로직)
public String login(UserRequest.LoginDTO requestDTO) {
...
if(!passwordEncoder.matches(requestDTO.getPassword(), userPS.getPassword())){
throw new Exception400("패스워드가 잘못입력되었습니다 ");
}
return JWTProvider.create(userPS);
}
passwordEncoder
는 DB에 저장된 해시된 비밀번호로부터 salt
값을 추출하고, rawPassword(입력된 비밀번호)에 salt
를 포함해 적용된 해시값과 DB에 저장된 해시값(salt
포함됨)을 비교한다.
✅ salt
로 인해 계속 바뀌는 해시값을 DB에 저장해도 되는 이유이다.
(즉, salt
를 추출해서 비교 대상에 적용하기 때문)
📌 salt
는 랜덤값이므로 Rainbow Table을 활용한 브루트 포스 공격을 막는다.
❓ 해시함수는 `단방향`(one-way)인데 해시값으로부터 `salt` 값을 추출할 수 있는 이유는?
좀 더 정확히 말하면, 해시된 값으로부터 salt를 추출하는 것이 아닌,
해시된 값 뒤에 salt를 이어붙여 DB에 저장한다.
Bcrypt(비밀번호+salt)+salt
❓ `salt`가 너무 쉽게 노출되었는데 위험하지 않을까?
거의 모든 해시값이 존재하는 Rainbow Table을 새로운 salt를 적용하여 만들기 어려우므로(1년 이상 걸림) 굳이 비밀로 할 필요가 없다.
728x90
'Spring > 카테캠 - TIL' 카테고리의 다른 글
TIL [0802] : 6주차 과제 수행 (통합테스트, API 문서 작성, 배포) (0) | 2023.08.02 |
---|---|
TIL [0731, 0801] : 6주차 강의 (WebMvcConfig, 통합테스트, API Docs, 배포) (0) | 2023.08.01 |
TIL [0728] 카카오테크캠퍼스 5주차 과제 (기능 구현 + 예외 처리) (0) | 2023.07.28 |
카카오테크캠퍼스 4주차 코드리뷰 (0) | 2023.07.28 |
TIL [0727] : 기능 구현, AOP 개념 정리 (0) | 2023.07.27 |