글의 목적은 회원가입 기능의 코드에 대해서만 다룬다.
회원가입의 이해를 위해선 crud 에 대한 이해가 필요하다
글의 목적이 crud가 아니므로 간단하게 설명하자면
c - create
r - read
u - update
d - delete
여기서 회원가입은 사용자를 생성하기 위해서 존재하는 기능이기에
create 즉 post에 해당한다
일단 회원가입의 코드를 하나하나 분석해보자
위 코드는 우리가 일반적으로 알고있는 회원가입이 아니고, 그냥 사용자의 비밀번호와 이메일, 이름만 수집하여 데이터 베이스에 저장하는 API 코드다.
이제 코드에 대하여 분석해보자
일단 const로 회원가입 기능 함수를 선언해준다.
이후 화살표 함수로 async (req, res) =>{} 형식으로 함수를 만들어준다
위 함수안에 try{} 를 만들어준다 try는 함수의 기능이 실행되는 사용자가 잘못된 동작을 행하는 경우 혹은 실질적으로 오류가 발생했을 경우에 오류들을 catch를 통하여 상황에 맞는 애러코드를 보내기 위해 사용한다.
{값1,값2,값3,......} = req.body
는 클라이언트로 부터 들어온 값을 잠시 body라는 컨테이너에 저장한다는 코드다.
이후 await myDataSource.query
는 입력된 데이터를 데이터베이스로 쿼리문을 통하여 저장하겠다 하는 코드다.
( INSERT INTO users ( nickname, password, email ) VALUES ( '${nickname}', '${hashedPassword}', '${email}' )
)
위 쿼리문은 users 테이블에 nickname,password,email,을 추가한다는 쿼리문이고 올바르게 데이터 베이스에 저장이 완료되면 데이터를 반환해야하는데
return res.status(201).json({"message":"userCreated"}) 이 코드를 통하여 클라이언트에게 201코드와 json으로 사용자 생성 성공했다는 메시지를 보낸다.
다음 } catch (error) { console.log(error) return res.status(error.statusCode).json({ "message": error.message }) }
를 통하여 오류가 발생한 경우 오류의 상태코드와 이유를 메시지로 보내도록 한다.
위코드는 회원가입(정보기입)의 기본적인 내용이다, 하지만 이대로 끝내면 가입하는 유저들의 정보가 겹칠 수 도 있고 보안에 취약하기 때문에 정상적인 회원가입 기능을 구현하려면 여러 예외처리와 에러핸들링이 필요하다.
예외처리를 하기 전 일단 우리가 일반적으로 사이트에 가입할때 상황을 생각해보자!
위 목록 외 여러가지가 추가로 있지만 일단은 이렇게 구성이 되어있다
그 외 우리가 모르는 기능이 추가로 존재한다
이유는 암호화가 되어있지 않으면 비밀번호가 유출 됬을시, 바로 계정이 해킹 당할 수 있기 때문이다. 하지만 암호화를 하게되면 데이터 베이스에 해쉬값으로 굉장히 복잡한 난수화가 되여 저장되기 때문에 역산이 불가능해 해킹을 어렵게 만든다.
더 대단한 기능들이 있겠지만 일단 위에 언급한 기능만 다뤄보자!
1, 클라이언트로 부터 받은 정보가 비어있을때 예외처리
위 코드를 분석해 보자면, 만약 이름과, 이메일, 비밀번호가 하나라도 값이 없는 경우 "KEY ERROR"라는 문자와, 상태코드 400을 보내는 코드다.
2, 이메일 형식에 대한 예외처리
우리가 알고있는 이메일의 형식은 localhost@name.com 이러한 형식일 것이다. 마찬가지로, 이메일에 @와 .이 안들어갔을 경우 "올바른 이메일이 아님니다." 라고 문자와, 상태코드 400을 보내는 코드다.
위 코드를 좀더 개선하자면, '.' => '.com' 으로 바꿔주면 더 좋을 것 같다.
3, 비밀번호 길이에 대한 예외처리
만약 비밀번호가 너무 짧으면 보안에 문제가 생길 것이다. 반대로 너무 길다면 사용자가 비밀번호를 잊을 수 도 있고, 관리가 힘들수도 있다.
따라서 비밀번호를 만들 때 문자열의 길이를 설정한다.
만약 비밀번호의 문자열 길이가 8자보다 적거나 13자리보다 큰 경우 "INVALID_PASSWORD" 문자와 추가로 상태코드 400을 보내는 코드다.
4, 가입 이메일 중복확인
데이터 베이스에 동일 가입자를 막기위해 중복확인을 한다.
첫번째 코드는 myDataSource(데이터베이스)로 부터 이메일을 불러오고, 만약 이메일이 등록된 유저라면 배열의 길이만큼 값이 발생해 "DUPLIVATE_EMAIL"이라는 문자와 상태코드 400을 보낸다.
만약 중복된 이메일이 없는 경우 빈 배열이므로 값이 존재하지 않아 예외처리 함수는 실행되지 않아 다음단계로 넘어갈 구 있다.
5, 비밀번호 특수문자 사용 여부
물론 세상에 완벽한 비밀번호란 없다, 만약 동적으로 비밀번호가 계속 바뀐다 하더라고 해킹당 할 수 있다.
따라서 실시간은 비밀번호가 바뀌지 않더라고 사용자의 계정 해킹을 조금이라도 늦추기 위해서 특수문자를 필히 포함한다.
위 코드는 만약 비밀번호에 /^(?=.*[!@#$%^&*()_+{}\[\]:;<>,.?~\\-]).{8,}$/
이러한 특수문자가 포함되지 않는다면 값이 참이 될 수 없고 boolean값이 거짓이면 "NOT_STRONG"문자와 상태코드 400을 보낸다.
6, 비밀번호 해쉬화
비밀번호를 난수화하는 코드다, 이를 진행하기 위해선 선행 작업이 필요하다
선행작업은 npm install bcrypt
를 설치하면 된다.
이후 아까 설명한 사실상 모든 예외처리가 끝나고 진행될 정보기입을 조금 수정한다.
이렇게 바꾸면 암호화된 비밀번호를 데이터 베이스에 저장할수있다.
이렇게 모든 예외처리를 통과하고 나면 이후에 사용자 정보가 데이터베이스에 기입이 되고 성공적으로 회원가입 완료를 할 수 있다!