Spring/카테캠 - TIL

응답값 검증

mint* 2023. 8. 2. 00:01
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);
}

passwordEncoderDB에 저장된 해시된 비밀번호로부터 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