Super Kawaii Cute Cat Kaoani
본문 바로가기
🏃‍♀️ 대외활동/Codeit Boost-Node.js

10주차 스터디 Express 유저 기능 구현하기 [코드잇 부스트 백엔드 스터디 ]

by wonee1 2024. 8. 18.
728x90

 

 

 

MVC 패턴이란?

 

 

MVC(Model-View-Controller)

MVC 패턴은 각각의 역할과 관심사를 분리함으로써 모델, 뷰, 컨트롤러가 독립적으로 작동하도록 하는 것이 목적

 

 

🔹모델: 주로 데이터베이스와 상호작용 및 비즈니스 로직을 관리

🔹뷰: 레이아웃과 화면처리

🔹컨트롤러: 모델과 뷰로 명령을 전달하는 역할

 

 

블로그 서비스

🔹사용자가 블로그에 글을 작성하려고 할 때 뷰는 입력양식 제공

     

     사용자가 글을 작성하면 컨트롤러가 입력을 받아 모델에 업데이트

     컨트롤러는 작성된 글의 내용을 모델로 전달하여 블로그의 글 목록에 추가

 

🔹사용자가 작성한 글을 수정하거나 삭제하려고 할때

→ 뷰는 해당 글을 편집하거나 삭제할 수 있는 인터페이스를 제공

    사용자의 동작에 따라 컨트롤러가 모델을 업데이트한다

 

🔹컨트롤러는 사용자의 입력에 따라 모델을 조작하여 상태를 업데이트한다

 

 

서비스(Service)

 

MVC 패턴을 사용할 경우, 대부분의 비즈니스 로직은 "모델"에서 처리되게 된다

하지만 실제 어플리케이션을 개발하는 상황에서 모델을 복잡한 비즈니스 로직 처리와 데이터베이스에 대한 관리 등 너무 많은 역할을 담당하여 코드가 복잡, 유지 보수가 어려워짐

 

 

→ 서비스 등장 배경

💡비즈니스 로직을 서비스로 분리하여 모델이 데이터베이스라는 하나의 역할만 할 수 있도록 도와준다

 

 

 

회원가입과 로그인

 

 

회원가입 로직

  1. 유저가 입력 받은 이메일이 사용 중인지 확인한다
    • 만일 이메일이 사용 중이라면 회원가입이 되지 않도록 한다.
  2. 이메일이 사용 중이 아니라면 입력 받은 유저를 데이터베이스에 저장한다.
    • 새로 가입된 유저 정보를 생성된 id와 함께 반환한다.
    • 이때, password와 같은 유저의 민감 정보는 반환되지 않아야 한다. filterSensitiveUserData 와 같은 메서드를 작성해서 노출되지 않도록 한다.

 

 

 

로그인하기

 

 

유저의 이메일과 비밀번호를 확인하는 로직

 

  1. POST 메소드에 /login 경로로 라우트를 만들고 이메일과 비밀번호를 받는다
  2.  
async function getUser(email, password) {

}

 

 

메소드에서 email과 password를 확인하고 유저를 찾는 로직

  1. 유저가 입력한 email로 데이터베이스의 유저 데이터를 찾아온다.
    • 만일 유저가 존재하지 않는다면 401 Unauthorized 상태 코드와 함께 빈 리스폰스를 반환한다.
  2. 데이터베이스에 저장된 password와 입력받은 password를 비교한다.
    • 일치하지 않는다면 401 Unauthorized 상태 코드와 함께 빈 리스폰스를 반환한다.
    • 일치한다면 우선 찾은 유저를 반환한다. 회원가입 때와 마찬가지로, 민감한 정보는 반환되지 않아야 한다.

 

 

해싱이란?

 

암호화와 해싱의 차이

🔹암호화: 특정 키를 사용하여 원본 데이터를 다시 원상 복구할 수 있는 형태로 변환

🔹해싱: 단방향 과정. 해시 함수를 사용하여 원본 데이터를 고정 길이의 고유한 문자열로 변환하여 원본데이터로 되돌릴 수 없다.

 

 

 

 

➕로그인 시 비밀번호 원본은 필요하지 않다. 로그인 시 입력받은 비밀번호를 해싱하여 데이터베이스에 저장되어있는 해싱된 비밀번호와 일치하는 지 비교한다

따라서 데이터베이스에 저장할 대 사용한 해싱 알고리즘과 로그인 시에 사용한 해싱 알고리즘은 동일해야한다

 

 

해시에 추가적으로 솔트(salt)의 사용이 필요

사용자의 비밀번호와 솔트를 결합해서 해시값을 계산하여 적용

 

 

Key Derivation Function

 

키 스트레칭(Key Streching)

🔹단방향 해시 함수를 보완하기 위해 솔팅을 이용

🔹salt와 password를 함께 해싱하여 다이제스트(digest)를 생성

🔹다이제스트는 해시 알고리즘에서 생성된 해시값을 의미

 

 

Adaptive Key Derivation Functions

키 파생 함수(key derivation Function)는다이제스트를 생성할 때 솔팅과 키 스트레칭을 반복하며 솔트와 패스워드 외에도 입력 값을 추가하여 공격자가 쉽게 다이제스트를 유추할 수 없도록 한다.

 

🔹PBKDF2

🔹bcrypt

🔹scrypt

 

 

bcrypt를 이용한 비밀번호 해싱하기

 

프로젝트에 해싱 적용해보기

  1. 회원가입에서 입력받은 비밀번호를 해싱하여 저장
  2. 로그인 시도시 입력받은 비밀번호를 해싱하여 해시된 비밀번호와 비교

1. 회원가입 시 비밀번호 해싱

비밀번호를 해싱하는 함수를 만들고, 저장 전 유저 비밀번호에 해시된 비밀번호를

 

 

2. 로그인 시 비밀번호 해싱

회원가입시 비밀번호를 해싱했기 때문에, 데이터베이스는 해시된 비밀번호가 들어가 있다. 이에 반해 유저는 평문으로 로그인을 시한다.

이때 bcrypt는 compoare 함수로, 평문을 해싱하여 해시된 비밀번호와 비교해준다

 

 

728x90