luminous_dev 2025. 2. 4. 12:09

프로젝트 만들기

더보기
Dependencies 추가

 

프로젝트 설정 추가

1. build.gradle : Security 추가 

// Security
implementation 'org.springframework.boot:spring-boot-starter-security'

 

 

2. Security 기능 제한 (SpringAuthApplication)

package com.sparta.springauth;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;

@SpringBootApplication(exclude = SecurityAutoConfiguration.class) // Spring Security 인증 기능 제외
public class SpringAuthApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringAuthApplication.class, args);
    }

}

 

 


Bean 수동 등록

  • @Component 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록 
  • 일반적으로는 이 방법이 제일 좋음 

프로젝트의 규모가 커질 수록 등록할 Bean들이 많아지기 때문에 자동등록을 사용하면 편리

@Controller, @Service와 같은 애너테이션들을 사용해서 Bean으로 등록하고 관리하면 개발 생산성에 유리

 

Q. 그럼 Bean 수동 등록은 언제 사용?

기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체들을 수동으로 등록하는 것이 좋음

이것을 기술 지원 Bean이라고 부름

공통 로그처리와 같은 비즈니스 로직을 지원하기 위한 부가적이고 공통적인 기능들을 수동 등록

 

특징 ) 비즈니스 로직 Bean보다는 수가 적음 / 문제 발생 시 그 위치 파악이 쉬움


Bean 수동 등록하는 방법

 

 

PasswordEncoder.class

package com.sparta.springauth.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class PasswordConfig {

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

 

 

1. Bean으로 등록하고자하는 객체를 반환하는 메서드를 선언하고 @Bean 설정

2. Bean을 등록하는 메서드가 속한 해당 클래스에 @Configuration 설정

3. Spring 서버가 뜰 때 Spring IoC 컨테이너에 'Bean'으로 저장 (Bean 이름은 메소드 명 ex. passwordEncoder) 

 

 

더보기

BCryptPasswordEncoder()?
PasswordEncoder는 인터페이스임 - 구현체를 넣어줘야 하는데 BCryptPasswordEncoder를 구현체로 선택한 것
DI를 받아서 사용
BCrypt = 비밀번호를 암호화해주는 해쉬 함수 (아주 강력한 Hash 메커니즘을 가지고 있음)

 

 

PasswordEncoderTest 

// 1. @Bean 설정된 메서드 호출
PasswordEncoder passwordEncoder = passwordConfig.passwordEncoder();

// 2. Spring IoC 컨테이너에 빈 (passwordEncoder) 저장
// passwordEncoder -> Spring IoC 컨테이너
  • 'Bean' 이름: @Bean 이 설정된 메서드명
    • public PasswordEncoder passwordEncoder() {..} → passwordEncoder

실습) Bean 수동 등록해보기

 

.matches (암호화되지 않은 input 평문, 암호화가 이뤄진 encodePassword)

: 기존 비밀번호와 입력한 비밀번호를 비교해주는 메소드

 

PasswordEncodeTest.java

package com.sparta.springauth;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.password.PasswordEncoder;

@SpringBootTest
public class PasswordEncoderTest {


    @Autowired
    PasswordEncoder passwordEncoder; //Bean 등록한 passwordEncoder을 주입 받아서 사용


    @Test
    @DisplayName("수동 등록한 passwordEncoder를 주입 받아와 문자열 암호화")
    void test1() {
        String password = "Robbie's password"; //현재 패스워드

        // 암호화
        String encodePassword = passwordEncoder.encode(password);//암호화 ()부분에 암호화할 패스워드를 넣으면 됨
        System.out.println("encodePassword = " + encodePassword);

        String inputPassword = "Robbie"; //실제 로그인을 했을 때 넣은 비밀번호 (다름)

        // 복호화를 통해 암호화된 비밀번호와 비교 (.matches)
        boolean matches = passwordEncoder.matches(inputPassword, encodePassword);
        System.out.println("matches = " + matches); // 암호화할 때 사용된 값과 다른 문자열과 비교했기 때문에 false
    }
}

 

동일하면 true/ 아니면 false가 반환될 것임

 

동일하지 않으므로 false 반환됨