컬럼명 | 컬럼타입 | 중복허용 | 설명 |
---|---|---|---|
id | Long | X | 테이블 ID (PK) |
username | String | X | 회원 ID |
password | String | O | 패스워드 |
String | X | 이메일 주소 | |
role | String | O | 역할 1) 사용자: USER 2) 관리자: ADMIN |
@Enumerated(value = EnumType.STRING)
EnumType.STRING
옵션을 사용하면 Enum의 이름을 DB에 그대로 저장USER(Authority.USER)
➡️ USER 라고 DB에 저장됨🚨 회원 등록시 '비밀번호'는 사용자가 입력한 문자 그대로 DB에 등록하면 안됨
'정보통신망법, 개인정보보호법'에 의해 비밀번호 암호화(Encryption)가 의무!
1. 예시
- 앨리스가 사이트에 회원가입하며 아이디와 패스워드를 입력함
- 아이디: alice
- 패스워드: nobodynobody
- 아무도 알 수 없기를 바라며 적은 패스워드를 아래와 같이 DB에 평문 그대로 저장해 두었다고 가정
- 만약 해커에 의해 회원정보가 갈취 당한다면 패스워드는 유출됨
- 해커 뿐만 아니라 DB 조회가 가능한 내부 관계자에게도 유출 가능성 존재
- 그래서 암호화 후 패스워드 저장이 필요
- 평문 ➡️ (암호화 알고리즘) ➡️ 암호문
- "nobodynobody" ➡️ "2a$10.."
- 만약 해커가 DB에 있는 앨리스의 패스워드 정보를 갈취하더라도 실제 암호를 알 수 없음
- 그래서 복호화가 불가능한 '단방향' 암호 알고리즘 사용이 필요
2. 양방향 ↔️ 단방향
- 양방향 암호 알고리즘
- 암호화: 평문 ➡️ (암호화 알고리즘) ➡️ 암호문
- 복호화: 암호문 ➡️ (암호화 알고리즘) ➡️ 평문
- 단방향 암호 알고리즘
- 암호화: 평문 ➡️ (암호화 알고리즘) ➡️ 암호문
- 복호화: 불가
🤔 그럼 사용자가 로그인할 때는 암호화된 패스워드를 기억해야 할까?- Password 확인절차
- 사용자가 로그인을 위해 "아이디, 패스워드(평문)" 입력 ➡️ 서버에 로그인 요청
a. 서버에서 패스워드(평문)을 암호화
b. 평문 ➡️ (암호화 알고리즘) ➡️ 암호문- DB에 저장된 "아이디, 패스워드(암호문)"와 일치 여부 확인
3. Password Matching
PasswordEncoder
- 해당 Securit에서 제공하는 비밀번호 암호화 메서드
- 사용자가 입력한 비밀번호를 암호화 되어 저장된 비밀번호와 비교하여 일치 여부 확인해줌
- 많이 사용됨
// 사용예시 // 비밀번호 확인 if(!passwordEncoder.matches("사용자가 입력한 비밀번호", "저장된 비밀번호")) { throw new IllegalAccessError("비밀번호가 일치하지 않습니다."); }
boolean matches(CharSequence rawPassword, String encodedPassword);
- rawPassword : 사용자가 입력한 비밀번호
- encodedPassword : 암호화되어 DB에 저장된 비밀번호
Name | Method | URL | 설명 |
---|---|---|---|
회원가입 페이지 | GET | /api/user/signup | 회원가입 페이지 호출 |
회원가입 | POST | /api/user/signup | 회원가입 |
ADMIN_TOKEN