회원가입 구현

금은체리·2023년 11월 16일
0

Spring

목록 보기
14/49

프로젝트 준비

프로젝트 설정 추가

  1. build.gradle : JPA, MySQL 추가
  2. application.properties
  3. Intellij Database 연동
    • CREATE DATABASE
    • 연동 순서
      • Database 탭 클릭하고 + 버튼 누름
      • Data Source > MySQL 클릭
      • User, Password, Database 정보를 추가한 후 Ok 클릭
  4. MySQL Database에 연결 완료

회원가입 설계

컬럼명컬럼타입중복허용설명
idLongX테이블 ID (PK)
usernameStringX회원 ID
passwordStringO패스워드
emailStringX이메일 주소
roleStringO역할
1) 사용자: USER

2) 관리자: ADMIN
  • 회원 DB에 매핑되는 @Entity 클래스 구현
    • @Enumerated(value = EnumType.STRING)
      • Enum : 관련있는 상수들의 집합
      • EnumType을 DB 컬럼에 저장할 때 사용하는 애너테이션
      • EnumType.STRING 옵션을 사용하면 Enum의 이름을 DB에 그대로 저장
      • USER(Authority.USER) ➡️ USER 라고 DB에 저장됨
  • 관리자 회원 가입 인가 방법
    • '관리자 가입 토큰' 입력 필요
      : 랜덤하게 생성된 토큰 사용
      • 보통 현업 에서는
        1) '관리자'권한을 부여할 수 있는 관리자 페이지 구현
        2) 승인자에 의한 결재 과정 구현 ➡️ 관리자 권한 부여

패스워드 암호화 이해

🚨 회원 등록시 '비밀번호'는 사용자가 입력한 문자 그대로 DB에 등록하면 안됨
'정보통신망법, 개인정보보호법'에 의해 비밀번호 암호화(Encryption)가 의무!

1. 예시
  • 앨리스가 사이트에 회원가입하며 아이디와 패스워드를 입력함
    • 아이디: alice
    • 패스워드: nobodynobody

  • 아무도 알 수 없기를 바라며 적은 패스워드를 아래와 같이 DB에 평문 그대로 저장해 두었다고 가정
    • 만약 해커에 의해 회원정보가 갈취 당한다면 패스워드는 유출됨
    • 해커 뿐만 아니라 DB 조회가 가능한 내부 관계자에게도 유출 가능성 존재

  • 그래서 암호화 후 패스워드 저장이 필요
    • 평문 ➡️ (암호화 알고리즘) ➡️ 암호문
      • "nobodynobody" ➡️ "2a$10.."
  • 만약 해커가 DB에 있는 앨리스의 패스워드 정보를 갈취하더라도 실제 암호를 알 수 없음
  • 그래서 복호화가 불가능한 '단방향' 암호 알고리즘 사용이 필요
2. 양방향 ↔️ 단방향
  • 양방향 암호 알고리즘
    • 암호화: 평문 ➡️ (암호화 알고리즘) ➡️ 암호문
    • 복호화: 암호문 ➡️ (암호화 알고리즘) ➡️ 평문
  • 단방향 암호 알고리즘
    • 암호화: 평문 ➡️ (암호화 알고리즘) ➡️ 암호문
    • 복호화: 불가

      🤔 그럼 사용자가 로그인할 때는 암호화된 패스워드를 기억해야 할까?
    • Password 확인절차
      1. 사용자가 로그인을 위해 "아이디, 패스워드(평문)" 입력 ➡️ 서버에 로그인 요청
        a. 서버에서 패스워드(평문)을 암호화
        b. 평문 ➡️ (암호화 알고리즘) ➡️ 암호문
      2. DB에 저장된 "아이디, 패스워드(암호문)"와 일치 여부 확인
3. Password Matching
  • PasswordEncoder
    • 해당 Securit에서 제공하는 비밀번호 암호화 메서드
    • 사용자가 입력한 비밀번호를 암호화 되어 저장된 비밀번호와 비교하여 일치 여부 확인해줌
    • 많이 사용됨
// 사용예시
// 비밀번호 확인
if(!passwordEncoder.matches("사용자가 입력한 비밀번호", "저장된 비밀번호")) {
		   throw new IllegalAccessError("비밀번호가 일치하지 않습니다.");
 }
  • boolean matches(CharSequence rawPassword, String encodedPassword);
    • rawPassword : 사용자가 입력한 비밀번호
    • encodedPassword : 암호화되어 DB에 저장된 비밀번호

회원가입 API 구현

회원가입 API 설계

NameMethodURL설명
회원가입 페이지GET/api/user/signup회원가입 페이지 호출
회원가입POST/api/user/signup회원가입

  • ADMIN_TOKEN
    • 일반 사용자인지 관리자인지 구분하기 위함


profile
전 체리 알러지가 있어요!

0개의 댓글