이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[Spring Security6] Password Encoder

  • 2023.08.05 00:20
  • Spring/Spring Security
반응형

 

 

 

사용자가 아이디와 비밀번호를 입력하면 스프링 시큐리티는 AuthenticationProvider 를 실행해 저장소에서 UserDetails 객체를 가져온다 (loadUserByUsername 메서드를 사용한다)

 

데이터베이스에 저장된 비밀번호와 사용자가 입력한 비밀번호를 비교하는데... 여기서 PasswordEncoder를 사용하지 않으면 비밀번호를 Plain Text로 다루고 equals 메서드로 두 비밀번호가 일치하는지 확인한다.

 

비밀번호를 평문 그대로 다루는건 위험하다.

 

인코딩

인코딩은 특정 데이터를 다른 형태의 정보로 변환하는 작업을 의미하고, 디코딩은 변환한 데이터를 원본 데이터로 변환하는 작업을 의미한다.

 

대표적인 예시로 아스키코드, Base64 등이 있다.

이미지나 동영상 데이터를 Base64로 인코딩해서 데이터가 전송 중 손상됨을 방지하고 데이터의 호환성을 높인다.

 

 

암호화

암호화는 평문을 특정 알고리즘을 사용해 다른 문자로 변환하는 기술이다.

암호화 된 문자를 복호화하려면 암호화 할 때 사용한 알고리즘을 알고 있어야 한다.

 

 

해싱

해싱은 데이터를 해시 값으로 변환하는 기술이다.

BCrypt는 해싱 알고리즘 중 하나로 비밀번호를 복호화 할 수 없어 비밀번호를 저장할 때 자주 사용한다.

 

BCrypt 알고리즘은 Salt 개념을 사용해 보안을 강화한다.

Salt는 해시 함수에 추가적으로 전달되는 임의의 데이터로, 같은 비밀번호를 해시화 할 때 솔트 값이 다르면 생성되는 해시 값이 다르다.

 

해시 함수가 단방향인 이유는 내부적으로 복잡하고 다양한 연산을 통해 정보를 변환하기 때문이다.

그 과정에서 원본 정보는 왜곡되고, 이 작업은 비가역적으로 진행돼 복호화 작업이 거의 불가능하다. 

 

BCrypt로 해시화된 비밀번호를 사용자가 입력한 비밀번호를 비교할 때는 해시화된 비밀번호에 사용된 salt값을 사용자가 입력한 비밀번호를 해시화 할 때 사용한다.

 

같은 salt 값을 사용해 비밀번호를 제대로 입력했다면 해시 값이 같음을 보장할 수 있다.

 

 

인코딩과 암호화 작업은 복호화가 가능하지만, 해싱은 복호화가 불가능해 비밀번호를 저장할 때의 표준으로 사용한다.

 

 

public interface PasswordEncoder {

	String encode(CharSequence rawPassword);

	boolean matches(CharSequence rawPassword, String encodedPassword);

	default boolean upgradeEncoding(String encodedPassword) {
		return false;
	}

}

 

시큐리티가 제공하는 PasswordEncoder 인터페이스이다.

 

encode : 암호화된 비밀번호를 반환한다.

match : 두 비밀번호가 일치하는지 확인한다.

upgradeEncoding : 해싱 방식을 변경할 때 사용한다. true로 설정 시 해싱 알고리즘을 변경한다.

 

아래는 구현체들이다.

 

NoOpPasswordEncoder : 해싱, 인코딩, 암호화를 수행하지 않는다. 테스트 용도로 사용하자.

BCryptPasswordEncoder : BCrypt 해싱 기술을 사용해 비밀번호를 암호화한다. salt를 사용해 레인보우 테이블 공격을 방어할 수 있다.

SCryptPasswordEncoder : 마찬가지로 salt를 사용한다. CPU와 메모리 비용이 높아 대량의 공격에 대해 방어할 수 있지만 서버에 부하를 줄 수 있다.

Argon2PasswordEncoder : 비교적 최신 알고리즘은 Argon2 해싱 알고리즘을 사용한다. 강력하지만 구현이 복잡하다.

 

 

 

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

 

시큐리티 설정 파일에서 BCryptPasswordEncoder를 반환하는 메서드를 빈으로 등록해 비밀번호를 해시화 해야 하는 곳에서 사용하자.

 

 

반응형
저작자표시 (새창열림)

'Spring > Spring Security' 카테고리의 다른 글

[Spring Security6] Authorization과 Filter  (0) 2023.08.09
[Spring Security6] CORS, CSRF  (0) 2023.08.08
[Spring Security6] 사용자 인증  (0) 2023.08.06
[Spring Security6] 주요 구성요소  (0) 2023.08.04
[Spring Security6] 내부 흐름  (0) 2023.07.30

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Spring Security6] CORS, CSRF

    [Spring Security6] CORS, CSRF

    2023.08.08
  • [Spring Security6] 사용자 인증

    [Spring Security6] 사용자 인증

    2023.08.06
  • [Spring Security6] 주요 구성요소

    [Spring Security6] 주요 구성요소

    2023.08.04
  • [Spring Security6] 내부 흐름

    [Spring Security6] 내부 흐름

    2023.07.30
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (677)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (9)
    • 💬 기록 (7)
    • 📚 공부 (6)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바