본문 바로가기
Java/Spring

23.06.29) Spring 강의 노트

by NH_club 2023. 6. 29.

일반적으로는 @Component를 사용하여 Bean을 자동으로 등록하는 것이 좋다.
규모가 커질 수록 Bean들이 많아지기 때문에 자동등록을 사용하면 편리하다.

그렇다면 Bean 수동 등록은 언제 사용 하는가?
더보기

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

예를 들어 공통 로그 처리와 같은 비즈니스 로직을 지원하기 위한 부가적이고 공통적인 기능들을 기술 지원 Bean이라 부르고 수동등록 한다. 비즈니스 로직 Bean 보다는 수가 적기에 수동으로 등록하기 부담스럽지 않다.

Bean 수동 등록하는 방법
더보기
@Configuration
public class PasswordConfig {

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

 

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

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

이렇게 하면 Spring 서버가 뜰 때 Spring IoC 컨테이너에 Bean으로 저장 됨

passwordEncoder는 인터페이스라서 구현체가 있어야 한다. BCryptPasswordEncoder를 구현체로 선택한 것이다.

BCryptPasswordEncoder는 *BCrypt 라는 Hash 함수를 사용해서 password를 encode 해 주는것.

*BCrypt란? 비밀번호를 암호화 해주는 Hash 함수. 현재까지 사용되는 것들 중에서 강력한 Hash 메커니즘을 갖고 있는 것 중 하나 많이 사용 됨.

수동 등록한 Bean 사용하기
더보기
@Autowired // 사용 하려는 클래스에 Bean 주입
PasswordEncoder passwordEncoder;

void test1() {
    String password = "1234";
    // 암호화
    String encodePassword = passwordEncoder.encode(password);
    String inputPassword = "4682";
    // encoder에서 제공하는 메서드 matches를 통해 비밀번호 비교
    boolean matches = passwordEncoder.matches(inputPassword, encodePassword);
    // 서로 다른 값이기에 false 저장
}
@Primary 란?
더보기

주입 시킬 때 같은 타입의 Bean이 여러개 있더라도 @Primary가 적용된 것으로 가져옴

@Qualifier 란?
더보기

Bean 객체에 이름을 달아주는 것과 같다.

@Component
@Qualifier("pizza")
public class Pizza implements Food{}

나중에 주입 시킬 때 같은 타입의 Bean이 많아도 해당 Qualifier에 명시한 이름의 Bean을 주입 시켜준다.

@Autowired
@Qualifier("pizza")
Food food;
인증과 인가의 차이점
더보기

실제로 그 사람이 맞는지 확인을 하는 행위는 인증

그 사람이 특정 리소스에 접근이 가능한지 허가를 확인하는 개념은 인가

비연결성과 무상태
더보기

서버와 클라이언트는 http라는 프로토콜을 이용하여 통신하는데 그 통신은 비 연결성과 무상태로 이루어진다.

비연결성:

서버와 클라이언트가 계속 연결되어 있다면 서버 비용이 기하급수적으로 늘어나기 때문에 실제로는 하나의 요청에 하나의 응답을 내버리고 연결을 끊어버리는 것이 비연결성이다.

무상태:

서버가 클라이언트의 상태를 저장하지 않는다는 것. 기존의 상태가 없다고 가정하는 프로토콜을 이용해서 구현되어 있다. 서버는 클라이언트가 전에 어떠한 요청을 보냈는지 관심도 없고 전혀 알지 못함.

쿠키와 세션
더보기

쿠키란 클라이언트(브라우져)에 저장될 목적으로 생성한 작은 정보를 담은 파일.

세션은 서버에서 클라이언트 상태를 유지하기 위해 사용 클라이언트 별 필요한 정보를 서버에 저장

서버에서 생성한 세션 ID는 클라이언트의 쿠키값으로 저장(세션쿠키)되어 클라이언트 식별에 사용

JWT
더보기

JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token.

일반적으로 쿠키 저장소를 사용하여 JWT 저장함

JWT는 1번 HEADER, 2번 PAYLOAD, 3번 VERIFY SIGNATURE 으로 이루어져 있다.

1,2번의 값을 서버가 갖고 있는 시크릿키와 같이 1번 알고리즘을 통해 값을 산출하고 비교하는 방식으로 로그인 유지

JWT 사용 이유
더보기

대용량 트래픽 처리를 위해 서버는 2대 이상 운영이 필요할 수 있음.

 

클라이언트1의 로그인 정보가 서버1에 있는데 서버2에 요청을 하게 되면 문제가 발생할 수도 있다.

해결 방법은 있다. 클라이언트 마다 요청 Server를 고정시키는 법, 세션 저장소를 생성하여 모든 세션을 저장하는 법

JWT의 장점으로는 동시 접속자가 많을 때 서버 측 부하를 낮출수 있다.

JWT의 단점으로는 다른 방법들보다 구현의 복잡도가 증가한다. JWT에 담는 내용이 커질 수록 네트워크 비용이 증가한다. secret key 유출시 조작이 가능하다. 이미 발급된 JWT를 일부만 만료시킬 방법이 없다.

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

23.07.01) Spring 강의 노트  (0) 2023.07.01
23.06.30) Spring 강의 노트  (0) 2023.06.30
23.06.26)Spring  (0) 2023.06.26
23.06.25)Spring 강의 노트  (0) 2023.06.25
23.06.24) Spring 강의 노트  (0) 2023.06.24