TIL #31 - 인증 & 인가 1

Sarang Lee·2021년 2월 7일
0

Session

목록 보기
6/7
post-thumbnail

✔️ 인증 Authentication

인증이란 유저의 identificationd을 확인하는 절차이다. ex)아이디와 비밀번호

인증이 필요한 이유는 무엇일까?

사용자가 아닌 서비스 제공자 입장에서 봤을 때 우리는 누가 우리 서비스를 쓰는지, 어떻게 사용하는지 추적하기 위해 필요하다.

그래야 정확하게 타겟팅을 해서 그 사람한테

  1. 마케팅을 할 수도 있고

  2. 어떤 이슈가 터졌을 때 적절히 대처해줄 수도 있고

  3. 니즈를 파악하여 서비스의 만족도를 올려준다거나

  4. 추가적인 서비스를 만들 때 어떤 부분에 초점을 맞춰야 할 지 파악

할 수 있다.


인증에 필요한 것들에는 아이디, 이메일, 비밀번호 등이 있다.
이 중에서 가장 중요한 것은 비밀번호

법적으로 개인정보취급자는 사용자의 개인정보가 노출되지 않도록 관리해주어야 한다.

고로 개인정보보호법의 의해 개인정보의 암호화는 필수적이다.


보통 HTTP 통신 시 개인 정보를 주고 받을 때 SSL 인증서를 적용해서 암호화를 하여 전송한다.
(크롬 창에 도메인 주소 왼쪽으로 자물쇠 아이콘이 그 의미 - HTTPS)


인증을 위해선 먼저 유저의 아이디와 비밀번호 생성 기능이 있어야한다.

회원가입 및 로그인 절차

  1. 유저 아이디와 비밀번호를 생성

  2. 유저 비밀번호를 암호화해서 DB에 저장한다.

  3. 유저가 자신이 회원임을 인증하기 위해 아이디와 비밀번호를 입력해 로그인을 시도하면

  4. 유저가 입력한 비밀번호를 암호화한 후 암호화되서 DB에 저장된 유저 비밀번호와 비교

  5. 일치할 경우 로그인 성공

  6. 로그인 성공 시 access token을 클라이언트에게 전송

  7. 이후부터는 access token을 첨부해서 request 서버에 전송하기 때문에 매번 로그인하지 않아도 된다.


유저의 비밀번호 왜 암호화할까?

유저의 비밀번호는 절대 비밀번호 그대로 DB에 저장하지 않고 꼭 암호화하여 저장해야 한다.

왜?

DB가 해킹 당하면 유저의 비밀번호도 그대로 노출된다.

보통 일반적으로 동일한 비밀번호를 여러 곳에서 쓰기 때문에 이는 해당 사이트만의 문제가 아닌 큰 일.
또한 외부 해킹이 아니더라도 내부 개발자나 관리자들이 유저들의 비밀번호를 볼 수 있다.

어떻게 암호화될까?

비밀번호 암호화에는 단방향 해쉬 함쉬가 주로 쓰인다.

우선 해쉬란?

컴퓨터 공학 데이터 구조에 있는 자료형 중에 하나. 인티저나 스트링 같이
본래 자료구조에서 빠른 자료의 검색과 저장, 데이터의 위변조 체크를 위해서 쓰이는 자료형
암호화를 위해 만든 것은 아님

단방향 해시 함수는 원본 메세지를 변환하여 암호화된 메시지인 다이제스트(digest)를 생성한다.

원본 메세지를 알면 암호화된 메세지를 구하기는 쉽지만, 암호화된 메세지로는 원본 메세지를 구할 수 없어 단방향성(one-way) 이라고 한다.

거의 동일한 암호라도 hash256이라는 해쉬 함수를 사용하면 해쉬 함수 값이 완전히 다르게 나오기 때문에 비밀번호 해쉬 값을 해킹하기 어렵게 만드는 점 중 하나이다. 이러한 효과를 avalance라고 한다.


    In [21]: import hashlib

    In [22]: m = hashlib.sha256()

    In [23]: m.update(b"test password")

    In [24]: m.hexdigest()
    Out[24]: '0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e'

    In [25]: m = hashlib.sha256()

    In [26]: m.update(b"test password2")

    In [27]: m.hexdigest()
    Out[27]: 'd34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb'

단방향 해쉬 에는 (MD5, SHA-1 - 둘은 보안취약), SHA-256 등이 있다.

이전에 쓰던 것들은 해커에 의해 점점 뚫리기 시작해 SHA-256을 쓰고 있다.


그러나 단방향 해쉬 함수에도 취약점이 있다.

같은 패스워드를 입력할 경우 해싱한 값이 항상 같기 때문에 해쉬값을 미리 계산해놓은 테이블을 만들어놓고 슈퍼컴퓨터가 거기 대입을 계속 하다보면 어느 순간 뚫릴 수 있다. (Rainbow table attack)

Rainbow table attack

미리 해쉬값들을 계산해 놓은 테이블을 Rainbow table이라고 한다.

해시 함수는 원래 패스워드를 저장하기 위해서 설계된 것이 아니라 짧은 시간에 데이터를 검색하기 위해 설계된 것이다. (Remember Set?) 그렇기 때문에 해시 함수는 본래 처리 속도가 최대한 빠르도록 설계되었다.

공격자는 매우 빠른 속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트를 비교할 수 있다.
(MD5를 사용한 경우 일반적인 장비를 이용하여 1초당 56억 개의 다이제스트를 대입할 수 있다).

이런 방식으로 패스워드를 추측하면 패스워드가 충분히 길거나 복잡하지 않은 경우에는 그리 긴 시간이 걸리지 않는다.
(대부분 사용자의 패스워드는 길거나 복잡하지 않을 뿐 아니라, 동일한 패스워드를 사용하는 경우도 많다).



Salting & KeyStretching

소금을 치고 늘려서!

이같이 단순해쉬값이 해킹에 쉽게 노출되는 허점을 보완하고자 salting과 Key Stretching이라는 아이디어가 나왔다. 비밀번호와 임의로 생성한 문자열(Salt)를 합쳐서 해싱하여 이 해시값을 저장하는 방법이다.

물론 이때에 비교를 위해 해시값과 소금(Salt)값을 같이 저장해야 한다.


Salting

  • 실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시값을 계산하는 방법

Key Stretching

  • 단방향 해쉬값을 계산한 후 그 해쉬값을 또 또 해쉬하고, 또 이를 반복하는 것을 말한다.

  • 해커가 패스워드 무작위 대입을 통해 해시값을 계산하는데 필요한 시간을 대폭 늘리기 위해 Salting 및 해싱을 여러번 반복해서 원본 값을 유추하기 어렵게 만드는 것이 Key Stretching 이다.

  • 최근에는 일반적인 장비로 1초에 50억 개 이상의 다이제스트를 비교할 수 있지만, 키 스트레칭을 적용하여 동일한 장비에서 1초에 5번 정도만 비교할 수 있게 한다. GPU(Graphics Processing Unit)를 사용하더라도 수백에서 수천 번 정도만 비교할 수 있다. 50억 번과는 비교할 수도 없을 정도로 적은 횟수다. 앞으로 컴퓨터 성능이 더 향상되면 몇 번의 반복을 추가하여 보완할 수 있다.


Bcrypt

Salting & Key Stretching 대표적 라이브러리

bcrypt는 앞서 말한 개념들을 실제로 적용하기 편하게 해주는 대표적인 라이브러리이다.
다양한 언어를 지원하고 있으며, 사용이 간편하여 쉽게 적용이 가능하다.

bcrypt는 hash 결과값에 소금값과 해시값 및 반복횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는데 있어 DB설계를 복잡하게 할 필요가 없다.

  • Salting과 Key Stretching을 구현한 해쉬 함수중 가장 널리 사용되는 것이 bcrypt이다.
  • bcrypt는 처음부터 비밀번호를 단방향 암호화 하기 위해 만들어진 해쉬함수이다.

bcrypt를 통해 해싱된 결과 값(Digest)의 구조는 아래와 같다.

In [40]: import bcrypt

In [41]: bcrypt.hashpw(b"secrete password", bcrypt.gensalt())
Out[41]: b'$2b$12$.XIJKgAepSrI5ghrJUaJa.ogLHJHLyY8ikIC.7gDoUMkaMfzNhGo6'

In [42]: bcrypt.hashpw(b"secrete password", bcrypt.gensalt()).hex()
Out[42]: '243262243132242e6b426f39757a69666e344f563852694a43666b5165445469397448446c4d366635613542396847366d5132446d62744b70357353'

알고리즘 옵션은
md5? sha-1? sha-256?

알고리즘 종류와 몇번 해싱했는지, 솔트값은 무엇인지 데이터에 함께 담겨 있지만 비밀번호를 알지 못하면 해쉬드 비밀번호를 찾기 어렵기 때문에 (사용자가 정확한 비밀번호를 입력하기 전까지는 모르기 때문에) 보여져도 괜찮다.

단방형 알고리즘은 수학자들이 주로 만듦.
회사에서 전문적인 인력을 두지 않는 한 해독하기 어려운 해쉬 값을 만들어내는 알고리즘은 구현하기 어렵다.

profile
UX에 관심 많은 개발 초보 Front-end Developer

0개의 댓글