티스토리 뷰

데이터를 암호화, 입력값 유효성 확인하기.
안녕하세요:)
이번 포스팅에서는 암호화와 암호화된 데이터의 유효성을 확인해보겠습니다.
혹시 리눅스 운영체제를 이용해보신 경험이 있으신가요? 저는 우분투 리눅스를 근 1년동안 잘 사용해 왔습니다. 어쨋든 리눅스 운영체제에서 새로운 사용자를 추가하고 관리자 계정을 통해 사용자 정보가 담겨있는 파일의 정보를 조회해보면 비밀번호부분이 암호화 되어있어서 관리자 조차 사용자의 암호를 알수없습니다.
이처럼 로그인 기능에서 비밀번호의 암호화는 필요합니다. 그렇다면 이를 어떻게 해야 할까요? 개념적으로 먼저 살펴본다음 코드로 연결해 보겠습니다.
1. 지금까지 해온방식
우리는 지금까지 비밀번호를 그대로 데이터베이스에 삽입하는 방식을 선택해왔습니다. (아래의 그림처럼 1234를 패스워드로 입력하면 데이터베이스에도 역시 1234가 삽입되는 방식)

하지만 이렇게 한다면 비밀번호로서의 가치가 있을까요? 어떤형태로든 데이터베이스파일을 조회 할수있는 권한만있다면 유저들의 비밀번호는 금방 노출될것입니다. 그렇기 떄문에 지금부터는 비밀번호를 데이터베이스에 직접 삽입하는일은 없을것입니다.
2. Hash function
그렇다면 어떻게 수많은 비밀번호를 직접 DB에 삽입하지 않을수 있을까요? 그 방법은 비밀번호 인풋을 특수한 함수를 통해 전혀다른 기호와 문자, 숫자들의 조합으로 바꾸는 것입니다. 이러한 함수를 Hash function이라 합니다. 해쉬함수를 통해 특수한 조합으로 바꾸지만 동일한 input에 대한 output은 항상 동일합니다. 비밀번호를 실제와 다르게 저장한다면 유저 데이터를 조회하는 관리자도 비밀번호를 쉽게 알아낼수 없을것입니다.

3. Salt (소금, 조미료)
그런데 동일한 인풋의 경우 매번 동일한 아웃풋이 발생한다면 그패턴을 역으로 분석해서 인풋을 알아내는일도 있을수 있습니다... 위의 Hash function 기능만을 사용한 비밀번호 암호화 체제가 해커들에게 뚫려 해킹을 당한 사례도 옛날에는 많이 발생했습니다.
그래서 추가된것이 랜덤한 조미료인 Salt입니다. 비밀번호를 해시함수에 넣기전에 랜덤한 조미료 몇글자를 섞어주는것입니다. 이 Salt는 항상 랜덤하게 만들어지기떄문에 가능한원리입니다.
만약 아주 우연하게! 이 salt가 567로 만들어졌다 가정해보겠습니다.

위그림을 해커의 입장에서 database의 password에 입력된 해시코드를 번역한다면 1234567이 나오게 될것입니다.
하지만 password가 1234567이 아닙니다. 567은 랜덤한 Salt 이고 실제 password는 1234이기 떄문에 이는 안전한 비밀번호가 될 것입니다.
유튜버 '노마드코더' 님의 친절한 부연설명)
https://www.youtube.com/watch?v=67UwxR3ts2E
4. 실전코딩!
위와 같은 간단한 원리를 통해 mongoDB에 mongoose 모듈과 해시값을 만들어주는 crypto 모듈을 사용해서 실습해보겠습니다.
4.1 몽구스 디비를 이용한 커넥션 생성만들기(스키마, 모델 함수분기),
기존 방식과 동일하게 on('error'), on('open'), on('disconnected')에 대한 내용들을 아래와 같이 만들어줍니다.

4.2 open에 해당하는 객체 생성메소드 작성
이제부터 본격적으로 Hash 와 Salt를 이용한 암호화를 다루어보겠습니다. 가장먼저 스키마의 정의는 다음과 같습니다. id, hashed_password, salt, name 네가지 항목으로 구성했으며 각 컬럼(필드)에는 default 속성을 모두 추가했습니다. 추가한 유저가 하나도 없어도 일단 DB는 존재해야하기 떄문입니다. id 값만 유니크하게 해주었습니다. 타입은 모두 String입니다.

생성한 스키마 객체의 .virture.set 메소드를 통해 몽고DB에는 저장되지 않는 가상의 속성인 password를 정정의해줍니다.
이후 set(가상 속성 password를 해시코드로 만듬, Salt를 설정함)메소드와 get(만들어진 해시password를 리턴)메소드를 정의 하겠습니다.

다음은 암화화된 비밀번호와 입력된 비밀번호를 비교하는 인증메소드입니다. 매개 변수인 plainText 와 inSalt로 encryptPassword 메소드를 실행해서 hashed_password와 비교하는 방식으로 인증합니다.

만약 값이 유효 하다면 값과 값의 길이를 && 연산으로 묶어 리턴합니다. 유효하지않다면 에러를 발생시키도록합니다. 각 필드값에 대한 유효성에 대한 확인 역시 길이에 대한 값을 콜백함수로 리턴함으로 이행합니다.

마지막으로 조회를 위한 메소드 두가지를 추가해준 이후 스키마를 users2 라는 모델로 정의해줍니다.

'Database > Express & MongoDB' 카테고리의 다른 글
Express & MongoDB - 스키마 메소드 모듈분기 (1) | 2021.08.05 |
---|---|
Express & MongoDB - 몽구스 모듈 (0) | 2021.08.04 |
Express & MongoDB - 수도 퀴즈 웹사이트 (0) | 2021.08.02 |
Express & MongoDB - DB 데이터 삽입, 수정 (0) | 2021.07.21 |
Express & MongoDB - DB 연동 (1) | 2021.07.20 |