Back-end

[Spring/Java] 스프링 시큐리티(Spring Security)를 사용하여 비밀번호 암호화 하기

somuxsomu 2024. 3. 15. 14:54

스프링 시큐리티(Spring Security)

를 이용해서 비밀번호 암호화 하기 🔒

 

스프링 시큐리티(Spring Security)를 사용하여 비밀번호를 암호화하는 방법을 알아보자.

 

대부분의 시스템에서는 회원의 관리(개인 정보 관련)를 하고 있고, 

그에 따른 인증(Authentication)과 인가(Authorization)에 대한 처리를 해주어야 한다.

 


스프링 시큐리티(Spring Security)란?

 

스프링(Spring)에서 제공해주는 인증(Authentication)과 인가(Authorization)

대한 처리를 위임하는 별도의 프레임워크이다.

 

스프링 시큐리티는

보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에,
개발자 입장에서는 일일이 보안관련 로직을 작성하지 않아도 된다는 장점이 있다.

 

 

"사용자가 회원가입을 할 때 로그인을 할때

사용자에게 비밀번호 입력을 요구를 한다."

 

👉🏼 하지만 DB에 저장 및 조회 등 을 할 때,

사용자의 비밀번호를 그대로 노출하여 저장 및 조회 등 을 할 수 없기 때문에

비밀번호를 암호화(복호화) 작업을 한 후 

DB에 저장 및 조회 등 을 해야하는데-

 

스프링 시큐리티에서 제공하는 메소드를 이용하여

안전하게 암호화하여 DB에 저장할 수 있다.

 


 

간략하게 개념에 대해 알아보았으니,

본격적으로 스프링부트에서 스프링시큐리티를 어떻게 활용 할 수 있는지에 대해 알아보려고 한다.

 

1. 메이븐(maven)에 스프링시큐리티 dependency 추가

 

 

우선 프로젝트에서 스프링 시큐리티를 사용하려면

메이븐, 그레이들 환경에 맞춰서 추가를 해줘야하는데-

 

메이븐(maven)인 경우에는

아래와 같이 pom.xml에 dependency를 추가를 해주면 된다.

 

 

dependency를 추가하면 스프링 시큐리티를 사용 할 수 있게 된다.

 

혹시나 추가를 했는데 적용이 안되어 있다면,

메이븐 업데이트 프로젝트를 해주면 된다.

 

 

* 그레이들(Gradle) 의존성 추가

위에는 메이븐(Maven) 의존성 추가에 대한 설명이였고,

그레이들(Gradel)은 아래와 같이 추가를 하면 된다.

implementation 'org.springframework.boot:spring-boot-starter-security:2.4.2'

 

 

2. PasswordEncoder를 주입받아 메소드를 활용하여 암호화를 해준다.

 

비밀번호 암호화 메소드를 사용하고 싶은

자바 클래스 파일에서 아래와 같이

 

스프링 시큐리티에서 제공해주는

 PasswordEncoder주입을 받기 위해 @Autowired를 해준다.

 

그리고나서

 PasswordEncoder의 encode 메소드를 이용하여 

아주 쉽고, 간단하게 비밀번호를 암호화 할 수 있다 !

 

 

passwordEncoding.encode(A)

String encode(CharSequence rawPassword);

 

 

 

아래(이미지)는 위 내용을 코드화 했다.

 

 

코드를 설명해보자면,

 

파라미터(Parameter)에서 받아온 유저의 비밀번호를

String(문자열)으로 캐스팅을 해주고,

PasswordEncoder.encode()에 인자로 넣어주면-

암호화된 비밀번호로 돌려준다.

그 값을 다시 파라미터에 담아서 Dao를 통해 데이터베이스(DB)에 저장 하면 된다!

 

 

간단하고 쉽게 그리고 안전하게

비밀번호를 암호화를 할 수 있다.

👍🏼

 

 

* 복호화 대신 matches를 이용하기

암호화 대해서 알아 보았으면,

반대로 복호화하는 방법에 대해 알아보자.

 

일반적으로 암호를 비교할때,

등록되어 있는(DB에서 가져온 값)암호를 복호화를해서

사용자가 입력한 암호랑 비교를 하는데-

 

이 방법이 아닌, 

matches 메소드를 이용해야 한다.

 

즉, 내부적으로 이미 저장되어있는

Security방식의 암호화키를 복호화하여 비교해주는

방법을 사용해야 한다.

 

passwordEncoding.matches(A,B)

boolean matches(CharSequence rawPassword, String encodedPassword);

 

A와 B를 비교해서 맞으면 True 반환, 틀리면 False 반환

 

그 이유는 HashCode를 사용해서 비교할 때에는 가능한 방법이지만,Spring Security(스프링 시큐리티)에서는 이러한 방법이 적용되지 않는다.스프링 시큐리티는 매번 랜덤키를 부여하기 때문에 따로 디코딩 작업을 추가로 해야하기 때문이다.

 

아무튼,우리는 편리하게 matches메소드를 사용해서 비교하면 된다는 말이다 

 


 

 

passwordEncoder에도 여러 메소드(bcrypt, sha256..)이 있고,

단방향 해시를 보완하기 위한 salt 같은 개념이 있는데요 !

다음 포스팅에서 한번 다뤄보도록 하겠습니다

😎