빈 등록
@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 |