밤빵's 개발일지
[TIL]20240730 Bcrypt 본문
Bcrypt에 대한 공부를했다. 로그인 기능 구현하면서 안 되는게 많으니까 코드만 계속 뜯어보다가 어떤 기능을 하는지는 아는데 자세히는 모르는 부분에 대해서 개발일지를 써야겠다고 생각했기때문에 오늘 개발일지에서는 Bcrypt의 개념, 사용 이유, 구현 방법, 그리고 주의할 점을 설명하고 예시코드를 이용해 내용정리를 했다.
🤓 Bcrypt란 ?
로그인 기능을 구현할 때, 중요한 부분 중 하나는 사용자 비밀번호의 안전한 저장이다. 비밀번호를 평문으로 저장하면 데이터베이스가 탈취되었을 때 보안에 치명적인 문제가 발생할 수 있기떄문에, 이를 방지하기 위해 Bcrypt와 같은 암호화 해시 함수가 사용된다. Bcrypt는 비밀번호를 안전하게 해시화하는 데 널리 사용되는 알고리즘으로, 높은 보안성과 효율성을 제공한다.
▶ Bcrypt의 개념
Bcrypt는 비밀번호 해싱을 위한 함수로, 비밀번호의 해시 값을 생성하여 데이터베이스에 안전하게 저장할 수 있도록 해준다. Bcrypt는 Blowfish 암호 알고리즘 기반의 암호화 해시 함수로, 주로 비밀번호 해싱에 사용된다. Bcrypt는 비밀번호를 단방향으로 암호화하여 원본을 알 수 없게 하며, 해시 값은 매번 다르게 생성되기 때문에 공격자가 동일한 비밀번호를 가진 사용자를 쉽게 식별할 수 없도록 한다.
▶ Bcrypt를 사용하는 이유
Bcrypt를 사용하는 이유는 다음과 같다:
→ 단방향 암호화:
Bcrypt는 단방향 해시 함수로, 해시 값을 통해 원래 비밀번호를 추출하는 것이 불가능하다. 이는 데이터베이스가 유출되더라도 사용자의 비밀번호가 안전하게 보호될 수 있음을 의미한다.
→ 솔트(Salt) 추가:
Bcrypt는 해시 생성 시 솔트를 추가하여, 동일한 비밀번호라도 매번 다른 해시 값을 생성한다. 이는 무차별 대입 공격(Brute Force Attack)과 무작위 대입 공격(Dictionary Attack)에 대한 저항성을 높인다.
→ 비용 인자(Cost Factor):
Bcrypt는 해시 계산에 소요되는 시간을 조정할 수 있는 비용 인자를 제공한다. 이는 하드웨어 성능이 증가함에 따라 암호화의 복잡도를 증가시켜 보안을 강화할 수 있게 해준다.
→ 보안성:
Bcrypt는 기존의 SHA-256이나 MD5와 같은 해시 알고리즘보다 보안성이 높다. 비밀번호 보안을 중요하게 여기는 시스템에서는 Bcrypt를 사용하는 것이 바람직하다.
▶ Bcrypt의 구현 방법
Bcrypt를 사용하여 비밀번호를 안전하게 해싱하고 검증하는 방법은 다음과 같다:
→ 비밀번호 해싱:
사용자가 회원가입할 때 입력한 비밀번호를 Bcrypt를 사용해 해싱한다. 이 해시 값을 데이터베이스에 저장한다.
→ 비밀번호 검증:
사용자가 로그인을 시도할 때 입력한 비밀번호를 Bcrypt 해시 함수로 다시 해싱한 후, 데이터베이스에 저장된 해시 값과 비교한다. 해시 값이 일치하면 사용자가 입력한 비밀번호가 올바른 것으로 간주하고, 로그인에 성공한다.
▶Bcrypt 사용 예시 코드
다음은 Spring Boot와 Bcrypt를 사용하여 비밀번호를 해싱하고 검증하는 코드 예시 이다. (간단하다는데 나는 시큐리티를 잘 몰라서 시큐리티에 대한 개발일지를 따로 작성해야겠다..!)
▽ Spring Security와 Bcrypt를 활용한 비밀번호 해싱 및 검증 예시
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final PasswordEncoder passwordEncoder;
public UserService() {
this.passwordEncoder = new BCryptPasswordEncoder();
}
// 비밀번호 해싱 메서드
public String hashPassword(String plainPassword) {
return passwordEncoder.encode(plainPassword);
}
// 비밀번호 검증 메서드
public boolean checkPassword(String plainPassword, String hashedPassword) {
return passwordEncoder.matches(plainPassword, hashedPassword);
}
}
→ BCryptPasswordEncoder 클래스는 Spring Security에서 제공하는 Bcrypt 해시 함수 구현체이다.
hashPassword 메서드는 사용자가 입력한 평문 비밀번호를 해싱하여 데이터베이스에 저장할 수 있는 해시 값을 생성한다.
checkPassword 메서드는 사용자가 입력한 평문 비밀번호와 데이터베이스에 저장된 해시 값을 비교하여 일치 여부를 확인한다. 위 코드 예시에서 BCryptPasswordEncoder의 encode 메서드는 입력받은 비밀번호를 해싱하고, matches 메서드는 평문 비밀번호와 해시 값을 비교하여 일치 여부를 반환한다.
▶ Bcrypt 사용 시 주의사항
Bcrypt를 사용할 때 주의해야 할 점은 다음과 같다:
→ 비용 인자(Cost Factor) 설정:
비용 인자는 보안성과 성능의 균형을 맞추는 데 중요한 요소이다. 너무 낮게 설정하면 보안이 취약해질 수 있고, 너무 높게 설정하면 서버의 성능에 부정적인 영향을 미칠 수 있다. 일반적으로 비용 인자는 10~12 정도로 설정하는 것이 적절하다.
→ Salt 관리:
Bcrypt는 솔트를 자동으로 추가하고 관리하므로, 솔트를 직접 관리할 필요는 없다. 그러나 솔트를 생성하는 과정과 관리가 올바르게 이루어지고 있는지 확인해야 한다.
→ 비밀번호 길이:
비밀번호 길이가 너무 짧으면 보안에 취약할 수 있으므로, 최소 8자 이상의 강력한 비밀번호를 요구하는 것이 좋다.
→ 서버 성능 테스트:
Bcrypt의 해시 생성 및 검증 과정은 CPU 사용량이 높아질 수 있으므로, 서버의 성능을 고려하여 적절한 비용 인자를 설정하고 성능 테스트를 수행해야 한다.
▶ 정리
Bcrypt의 개념, 사용 이유, 구현 방법, 그리고 사용 시 주의할 점에 대해 공부하면서, Bcrypt는 비밀번호를 안전하게 해싱하고 검증하는 데 있어 높은 보안성을 제공하는 중요한 도구이고, Bcrypt의 단방향 암호화, 솔트 추가, 비용 인자 설정을 통해 로그인 시스템의 보안을 강화할 수 있다. 그저 해싱하는거다 라고만 알고있던 지난 날의 나를 반성하는 중!
'개발Article' 카테고리의 다른 글
[TIL]20240801 로드밸런서 (0) | 2024.08.02 |
---|---|
[TIL]20240731 쿠키와 세션 (0) | 2024.08.02 |
[TIL]20240729 jwtUtil은 순수하다 (0) | 2024.07.30 |
[WIL]20240728 리프레시토큰은 어렵다. (0) | 2024.07.28 |
[TIL]20240727 JPA의 트랜잭션 (0) | 2024.07.27 |