본문 바로가기
개발 일지/Day by day

2024-01-26 TIL

by 쁘띠뀨띠 2024. 1. 26.

빈 등록

@Configuration
//빈을 등록하는 메서드가 속해있는 해당 클래스 위 @Configuration -> spring ioc container에 Bean으로 저장
public class PasswordConfig {

    @Bean
    //빈으로 등록하고자하는 객체의 메서드 위에 @Bean
    public PasswordEncoder passwordEncoder() { 

public interface Food {
    void eat();
}

인터페이스를 구현하는 구현체 클래스에 @Component  설정시, 해당하는 인터페이스가 빈으로 등록

 

같은 타입의 객체가 두개 있을 경우?

Food food; = 오류, Food를 구현하는 구현체 클래스명 직접 명시

@Component
@Primary 
public class Chicken implements Food{

@Component
@Qualifier("pizze")
public class Pizza implements Food{
@Autowired
@Qualifier("pizze") // @Qualifier 로 연결된 객체를 찾는다
 Food food;

@Primary  : 같은 타입을 받는 빈이 여러개가 있더라도 우선적으로 Primary가 있는 빈 객체를 주입한다, 전역적인느낌

@Qualifier : 사용시 Primary가 있더라도 우선순위를 갖는다, 지엽적인느낌


1_  @RestController / @RequiredArgsController + private final 필드;

2_  @Controller + 필드-생성자

private final UserService userService;

public UserController(UserService userService) {
    this.userService = userService;
}

3_메서드주입

4_@Autowired

@Autowired // passwordEncoder 주입
PasswordEncoder passwordEncoder;

패스워드 암호화

@Configuration
//빈을 등록하는 메서드가 속해있는 해당 클래스 위 @Configuration -> spring ioc container에 Bean으로 저장
public class PasswordConfig {

    @Bean
    //빈으로 등록하고자하는 객체의 메서드 위에 @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
        //BCrypt : 비밀번호를 암호화해주는 hash 함수 - 를 사용해 password 를 인코딩
    }
}

 

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 passwordEncoder;

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

        // 암호화
        String encodePassword = passwordEncoder.encode(password); //암호화할 문자열 넣기
        System.out.println("encodePassword = " + encodePassword);

        // 로그인 가정
        String inputPassword = "Robbie";

        // 복호화를 통해 암호화된 비밀번호와 비교
        // db에 저장된 password 와 현재 입력된 password 일치 여부 확인
        // passwordEncoder.matches (입력받은문자열, 암호화한 상태값)
        boolean matches = passwordEncoder.matches(inputPassword, encodePassword);
        System.out.println("matches = " + matches); // 암호화할 때 사용된 값과 다른 문자열과 비교했기 때문에 false
    }
}

 

*PasswordEncoder 인터페이스 참고

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.security.crypto.password;

public interface PasswordEncoder {
    String encode(CharSequence rawPassword);

    boolean matches(CharSequence rawPassword, String encodedPassword);

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

.encode(암호화할대상) : 암호화

.matches(입력한대상,암호화한대상) : 서로 일치하는지 여부 확인 boolean


cookie & session

로그인 - db확인 - 세션저장소(저장 및 id 발급) - 응답 // 다시 요청(쿠키) - 세션저장소(쿠키 검증) - 응답

@GetMapping("/create-cookie")
public String createCookie(HttpServletResponse res) {
    addCookie("Robbie Auth", res); 

    return "createCookie";
}

addCookie(cookieValue) 공백이 있으면 안되지만

URLEncoder.encode( cookieValue, 타입).replaceAll("\\","%20"); 을 통해 공백을 바꿔준다

cookieValue = URLEncoder.encode(cookieValue, "utf-8").replaceAll("\\+", "%20");

'개발 일지 > Day by day' 카테고리의 다른 글

2024-02-06 TIL  (0) 2024.02.06
2024-01-31 TIL  (0) 2024.01.31
2024-01-23 TIL  (1) 2024.01.24
2024-01-18 TIL  (0) 2024.01.18
2024-01-03 TIL  (1) 2024.01.03