유저 비밀번호 암호화
🤷🏻♀️ 비밀번호는 어떻게 관리해야 할까?
: DB에 저장 시 개인정보를 해싱하여 복원할 수 없도록 암호화해서 저장 해야 한다.
( DB가 해킹을 당해도 pw 그대로 노출되지 않으며, 내부 인력도 알 수 없도록 하기 위해서)
🤷🏻♀️ 암호화는 어떻게 할까?
✔️ 해쉬 함수?
: input 넣으면 output이 빠르게 나오는 함수이다. (같은 input > 같은 output / 다른 input > 다른 output )
( MD5, SHA-1 : 보안에 취약) , SHA-256 등이 있다.
✔️ 단방향 해쉬 ?
: 원본 메시지를 변환하여 암호화된 메시지인 digest 다이제스트를 생성한다.
( 원본을 알면 암호화된 메시지를 구하기는 쉽지만, 암호화된 메시지로는 원본 구하기 어렵다. )
예시)
"test password"를 hash256 해쉬함수를 사용하면
0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e
"test password2"를 hash256 해쉬 함수를 사용하면 d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb
하지만, 해쉬함수도 취약점이 있다.
Rainbow table attack - 미리 해쉬값들을 계산해 놓은 테이블을 Rainbow table이라고 한다.
원래 해쉬함수는 패스워드 저장용이 아니라, 짧은 시간에 데이터를 검색하기 위해 설계된 것이다.
이러한 속성을 이용하여 빠른속도로 임의의 문자열의 digest와 해킹할 대상의 digest를 비교할 수 있다.
( 1초당 56억개 정도 )
단방향 해쉬의 취약점 보완
✔️ Salting
: 입력한 비밀번호 + 임의생성 문자열(salt) = hash값
( 비교를 위해서 hast값과 salt값을 같이 저장한다. )
✔️ Key Stretching
: 단방향 hash값 계산 후, 그 값을 또 hash hash hash...반복한다.
( 무작위 대입을 통해 hash값을 계산시간을 대폭 늘리기 위해서, salting 여러번 반복하여 원본값 유추를 어렵게 만드는 것)
> key stretching을 적용하여 동일한 장비에서 1초에 5번정도만 비교할 수 있게 한다.
완벽한 암호화는 없다. 암호화 기술의 발달은 뚫리는 시간을 무한정으로 늘리는 방향으로 발달하는 것이다.
그러니까 비밀번호 자주바꿔,,
bcrypt
: salting & key stretching library
비밀번호를 단방향 암호화 하기 위해 만들어진 해쉬함수이다.
결과값에 salt와 hash, 반복횟수를 같이 보관하기때문에 DB설계를 복잡하게 할 필요가 없다.
https://www.npmjs.com/package/bcryptjs
bcryptjs 써보기
npm install bcryptjs --save-dev
Async ver.
JWT (Json Web Tokens)
: access token을 생성하는 방법중 하나이다.
유저 정보를 담은 JSON 데이터를 암호화해서 클라이언트와 서버간에 주고받는 것이다.
유저가 로그인 성공 후에는 access token이라는 암호화된 유저정보를 첨부해서 req 보낸다.
//유저 로그인
POST /auth HTTP/1.1
Host: localhost:5000
Content-Type: application/json
{
"username": "joe",
"password": "pass"
}
//access token
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E"
}
서버에서는 token을 복호화해서 해당 유저의 정보를 얻게된다.
{
user_id = 1
}
이런 절차는 해당 유저가 매번 로그인을 해도 되지 않도록 하는 것이다.
'Archive' 카테고리의 다른 글
[21.11.25] 두 자연수의 누적값 중 최솟값 (0) | 2021.11.25 |
---|---|
[React] Formik / Yup (0) | 2021.11.22 |
[TIL] Strapi (0) | 2021.11.18 |
[JS] this (0) | 2021.11.13 |
[React] Ajax - axios (0) | 2021.10.25 |