Spring/Spring Boot

[Spring Boot][KoLiving] 3-2 Sign-up

noahkim_ 2023. 9. 19. 01:35

이전 포스팅

2. 패스워드 설정

악의적인 공격

  • 입력된 패스워드의 데이터는 데이터베이스에 평문으로 저장되면 안됩니다.
    • 데이터베이스가 공격받아 아이디-패스워드가 노출될 수 있습니다.
    • SQL Injection 등
  • 패스워드 정보를 보호하기 위해 부호화를 통한 보안 방식이 권고되었습니다.

 

단방향 해싱

장점 
  • 보안성
    • 해싱 값이 노출되더라도 원본을 알아내기 어렵습니다.
    • 비선형 연산, 혼돈, 확산 등의 성질을 근거로 해시 함수의 복구 안전성이 확보됩니다.
  • 적은 연산
    • 입력받은 패스워드 값이 저장된 해싱값과 일치하는지 여부를 쉽게 얻을 수 있습니다.

 

단점
  • 레인보우 테이블
    • 단방향 해시값에 대응되는 다양한 원본값을 미리 계산해둔 테이블입니다.
    • 이를 통해 해시값과 일치하는 원본 비밀번호를 빠르게 찾을 수 있습니다.

 

BCrypt

salt
  • 입력 패스워드를 사용하여 만든 랜덤 바이트값입니다.
  • salt값과 입력 패스워드를 사용하여 유일한 단방향 해시값을 만듭니다.

 

장점
  • 이로 인해 레인보우 테이블은 유효성을 잃게 됩니다.
  • 복호화 되어도 모든 패스워드가 털리지 않고 해당 패스워드만 털리므로 피해를 최소화할 수 있습니다.

 

강도 설정
  • 보안의 저항성을 늘리기 위해 높은 강도로 설정됩니다.
  • 기본적으로 강도 10으로 셋팅되어 있습니다.
    • 강도가 높을수록 의도적으로 많은 연산을 수행합니다.

 

3. 프로필 입력

Gender code 매핑

ModelMapper
  • Class to JSON 매핑을 담당하는 모듈입니다.

 

Gender 'code' 필드 매핑
  • 클라이언트는 gender의 코드값으로 요청합니다.
  • gender의 'code' field를 Gender Enum 상수로 매핑합니다.
  • ModelMapper에 해당 매핑에 대한 설정을 추가하였습니다.
@Bean
public ModelMapper modelMapper() {
    ModelMapper modelMapper = new ModelMapper();
    modelMapper.getConfiguration()
            .setMatchingStrategy(MatchingStrategies.STRICT)
            .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE)
            .setFieldMatchingEnabled(true);

    modelMapper.typeMap(ProfileDto.class, User.class).addMappings(mapper -> {
        mapper.map(ProfileDto::toGender, User::setGender);
    });

    return modelMapper;
}

 

4. 가입 완료

회원가입의 모든 과정이 마무리되면 다음과 같은 과정을 거칩니다.

 

AccessToken 발급

  • 뒤에서 설명드리겠지만, 저희 프로젝트는 JWT 토큰 기반으로 인증 과정이 이루어집니다.
  • 이를 위해 회원가입 후, access token을 발급합니다.

 

RefreshToken 발급

  • RTT 기법 도입을 위해 발급됩니다.

 

ConfirmationToken 행 삭제

  • ConfirmationToken의 인증 이메일 관련 행이 역할을 다하여 삭제됩니다.
  • 일배치를 돌려 유효기간이 지난 토큰은 삭제됩니다.