토이프로젝트 5일차 회고록

doobyeol·2022년 4월 23일
0

TIL

목록 보기
19/37

1. Hash 암호화의 취약점

Hash 암호화

hash 함수를 이용하여 암호화한 해쉬값은 복호화가 불가능하다.
암호화된 해쉬값과 평문(사용자의 비밀번호라던지)을 비교하기 위해서는
암호화된 해쉬값을 비교한다.
참고 : https://medium.com/shell-tharsis/hash-collision-5891d7dde54f

Hash 충돌이란 ?

hash 함수가 서로 다른 두 입력에 대해 동일한 출력 값을 나타내는 경우
어떤 hash 함수를 사용하더라도 비둘기집의 원리로 인해 해쉬 충돌은 피할 수 없다.

Hash 충돌 어떻게 막지 ?

hash + salt
hash에 소금친다는 표현을 사용하던데 ㅋㅋㅋ
해쉬값에 매번 바뀌는 salt를 붙여서 데이터를 안전하게 저장하고
무결성을 보장하는데 사용되는 방법!

Salt가 매번 바뀌는 값인데 어떻게 비교해?

DB에 저장된 사용자의 비밀번호가 해쉬값 + salt 로 저장이 되었고
salt는 매번 바뀌는 값인데 어떻게 비교가 가능해 ?

Spring Security에는 BCryptPasswordEncoder 라는 해쉬 알고리즘을 이용하여 비밀번호를 암호화해주는 클래스가 있는데,
뭐.. 수학적인 공식을 이용해서 matches라는 메서드가 다 해주더라고

  • 테스트 코드
@Slf4j
public class BcryptPasswordEncoderTest {

    @Test
    public void testEncode() {
        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String encoded = passwordEncoder.encode("test123");
        log.info("encoded : {}", encoded);

        boolean result = passwordEncoder.matches("test123", "$2a$10$VbH05m/0tbkPA/tBjy7nCeFmJS.vNNvgot8B5FCW8dbuS1OJgXN.2");
        log.info("result {}", result);

        Assertions.assertTrue(result);
    }
}



2. Spring Security

코드 복기 .. !

  1. jaxb란 ?
    Java Object를 XML로 직렬화하고, XML을 Java Object로 역직렬화해주는 자바 API
    아마도 jjwt 라이브러리에서 jaxb가 필요한듯 한데 JAVA 6~9버전에서는 jaxb가 내장되어 있지만 우리가 사용하는 JAVA 11버전에서는 없기 때문에 dependency를 따로 추가해주어야 한다.

  1. Autowired 필드주입
    필드주입을 한 이유는 에러가 나서.. 아마도 생성자 주입과 필드 주입이 빈을 주입하는 시점이 다르기 때문이 아닐까? 라는 생각인데 필드 주입은 먼저 빈을 생성한 후에 필드에 대해 주입하고 생성자 주입은 객체를 생성하는 시점에 필요한 빈을 주입, 즉 먼저 빈을 생성하지 않는다. 필드주입을 사용하여 먼저 빈이 생성되었을 때에는 에러가 나지 않았음. 로직상 어쩔 수 없는 듯

  1. Login API
    @RequestBody를 UserDto가 아닌 LoginRequest로 받은 이유
    로그인에는 사용자의 id와 pw만 필요한데 UserDto에는 그 외에 불필요한 사용자의 정보가 담겨있다. 그렇기 때문에 유지보수할때 사용자의 어떤 정보들을 필요로 하는지 로직을 분석해야하는 불편함? 이 있을 수 있기 때문에 딱 로그인에 필요한 데이터만 있는, login만을 위한 dto를 따로 만들어준 것. 이라고 이해를 했다.

  1. LoginResponse
    마찬가지로 로그인을 성공했을때 필요한 데이터를 LoginResponse에 따로 정의함
    type 변수 Bearer는 토큰 앞에 붙어야 하는 값이고 올바르게 넘어왔는지 체크하기 위한 용도
    refreshToken은 token이 만료가 되었을때 refeshToken이 있으면 token을 재발급해 주기 위한 용도

  1. BCryptPasswordEncoder 테스트 코드
    해싱된 비밀번호 값으로 DB에 업데이트 해주었고 salt가 매번 바뀌는 값인데 어떻게 DB에 저장된 값과 비교가 가능한지 maches 메서드 테스트함



3. 느낀점

아 ~ 그런게 있다는구나 ~ 정도의 수준으로 공부해온 지금까지의 나를 반성한다..! 선생님이 정말 치밀하게 구석구석 잘 가르쳐주신 덕분에 막막하기만 했던 Spring이 점점 더 재밌어진다. BCrypt라는것도 내장되어있고 진짜 짱인걸 ~ 그리고 그게 왜 필요한지도 알지롱 ~ 아 ~~ 너무 재밌다!!! 그런데 이제 한가지 내가 부족하다고 느꼈던 점은 자바에 대한 기초지식이 너무 얉다..? 뭔가 잘 활용하고 싶은데 자바에 대한 지식이 부족하다보니 로직을 이해하는 부분이 좀 버벅인다 .. 오늘 자바 학원 알아봤는데 마땅한 곳이 없어서 인강을 알아보는 중이다. 자바 기초 틈틈히 공부한다 !!!!!!!!!!!!! 부족한게 있으면 없애면 돼 ! 나는 할 수 있어 ! 이유는 몰라 ! > . <

0개의 댓글