카테고리 없음

20240909Mon 🔐회원 가입 및 로그인 구현

ddh1713 2024. 9. 9. 11:17

Index

1. Bean 수동 등록
2. 같은 타입의 Bean이 2개라면?
3. 인증과 인가
4. 쿠키와 세션
5. JWT
6. 패스워드 암호화

1. Bean 수동 등록

 

@Component 를 사용하면, @ComponentScan 에 의해 자동으로 스캔되어 해당 클래스를 Bean 으로 등록해줍니다. 일반적으로 @Component 를 사용하여, Bean 을 자동으로 등록하는 것이 좋습니다. 비즈니스 로직과 관련된 클래스들은 그 수가 많기 때문에 @Controller, @Service 와 같은 애너테이션들을 사용해서 Bean 으로 등록하고 관리하면 개발 생산성에 유리합니다.

 

 수동 등록은 언제 사용하는가?

 

기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체들을 수동으로 등록하는 것이 좋습니다.  수동 등록을 하면, 문제가 발생했을 때, 해당 위치를 파악하기 쉽다는 장점이 생깁니다.

 

 

2. 같은 타입의 Bean이 2개라면?

 

[1] 등록된 Bean 이름 명시하기

 

@Autowired는 Bean Type ⇒ Bean Name 순으로 찾습니다.

 

[2] @Primary 사용하기 (범용적으로 사용될 때)

 

@Primary 가 추가되면 같은 타입의 Bean이 여러개라도 @Primary 가 붙은 객체에 우선적으로 주입해줍니다. 

 

[3] @Qualifier(" ") 사용하기 (지엽적으로 사용될 때)

 

같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용되어 있다면 Qualifier의 우선순위가 더 높습니다. 하지만 Qualifier는 주입받고자하는 곳에도 추가해줘야 합니다.

 

3. 인증과 인가

 

[1] 인증 (Authentication) : 해당 유저가 실제 유저인지 인증

[2] 인가 (Authorization) : 리소스에 접근이 가능한지 허가(권한)를 확인

 

[3] 비연결과 무상태 (Connectionless & Stateless)

 

4. 쿠키와 세션

 

[1] 쿠키 : 클라이언트에서 저장될 목적으로 생성한 작은 정보를 담은 파일

구성 요소
Name (이름) : 쿠키를 구별하는 데 사용되는 키 (중복될 수 없음)
Value (값) : 쿠키의 값
Domain (도메인) : 쿠키가 저장된 도메인
Path (경로) : 쿠키가 사용되는 경로
Expires (만료기한) : 쿠키의 만료 기한 (만료기한 지나면 삭제됨)

 

[2] 세션: 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용됩니다.

 

쿠키와 세션 비교
쿠키 세션
클라이언트에 저장 웹 서버에 저장
쿠키 저장 시 만료 일시 설정 가능 브라우저가 종료, 클라이언트가 로그아웃, 서버가 설정한 유지기간까지 해당 클라이언트이 재요청이 없는 경우에 만료
용량 제한이 브라우저 별로 다름 용량 제한 없음
보안이 취약 보안 : 서버에 저장되기 때문에 비교적 안전

 

 

5. JWT

 

[1] JWT : JSON Web Token. JSON 포맷을 이용하여, 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token 입니다. 쿠키 저장소를 사용하여 JWT를 저장합니다.

 

[2] JWT를 사용하는 이유 : 로그인 정보를 Server에 저장하지 않고, Client에 로그인 정보를 JWT로 암호화하여 저장하고, JWT를 통해 인증/인가

 

[3] JWT 장/단점

장점 단점
- 동시 접속자가 많을 때, 서버 측 부하를 낮춤
- Client, Server가 다른 도메인 사용할 때
- 구현의 복잡도 증가
- JWT에 담는 내용이 커질 수록 네트워크 비용 증가
- 이미 생성된 JWT를 일부만 만료시킬 방법이 없음
- Secret Key 유출 시 JWT 조작 가능

 

[4] JWT 구조

JWT는 누구나 평문으로 복호화 가능하지만, Secret Key가 없으면 JWT는 수정이 불가능합니다. (Readonly 데이터)

Header / Payload / Signature

 

[5] JwtUtil

 

Util 클래스 : 특정 매개 변수(파라미터)에 대한 작업을 수행하는 메서드들이 존재하는 클래스를 뜻합니다. 다른 객체에 의존하지 않고, 하나의 모듈로서 동작하는 클래스입니다. JwtUtil이라는 클래스는 다음과 같은 관련 기능들을 수행할 예정입니다.

(1) JWT 생성
(2) 생성된 JWT를 Cookie에 저장
(3) Cookie에 들어있던 JWT 토클을 Substring
(4) JWT 검증
(5) JWT에서 사용자 정보 가져오기

 

[6] @Slf4j

[7] @PostContruct

 

6. 패스워드 암호화

 

[1] 암호화 : 평문 ⇒ (암호화 알고리즘) ⇒ 암호문

단방향 암호 알고리즘을 사용한다.

 

[2] 단방향 ⇔ 양방향

양방향 알고리즘은 암호화, 복호화가 가능

단방향 알고리즘은 암호화는 가능하지만, 복호화가 불가능

 

[3] Password Matching

boolean matches(CharSequence rawPassword, String encodedPassword);
// rawPassword : 사용자가 입력한 비밀번호
// encodedPassword : 암호화되어 DB에 저장된 비밀번호
// 사용 예시
// 비밀번호 확인
if(!passwordEncoder.matches("사용자가 입력한 비밀번호", "저장된 비밀번호")){
	throw new IllegalAccessError("비밀번호가 일치하지 않습니다.");
}