Web기초

인증, 인가에 대해서 알아보자.

빈코더 2021. 9. 9. 22:08
728x90

인증, 인가에 대해서 알아보자.

인증(Authentication)이란 무엇인가?

인증은 사용자를 식별하기 위해 하는것이 인증이라고 한다.

쉽게 말하면 사용자가 맞는지 틀리는지 확인하는 과정이라고 생각하면 된다.

예를 들어 회원가입과 로그인이 대표이다.

인증을 하려면 일단 사용자에 대한 정보를 알아야 하는데

그 정보를 아무렇게나 저장하게 되면 정보를 해킹당할 수 있다.

그것을 방지하기위한 가장 기본이 되는것이 비밀번호이다.

하지만 이 비밀번호를 입력받은 그대로 저장을 하게 되면

해킹을 당하기 쉽다. 해커가 DB를 해킹해도 쉽게 암호를 읽지 못하게 해야한다.


그럼 어떻게 비밀번호를 관리를 해야하나?

해커가 DB를 해킹해도 쉽게 암호를 읽지 못하게 암호화를 한다.

예를 들어 1234라는 비밀번호가 DB에 저장이 된다고 치면 1234라는 비밀번호가 그대로 저장이 되는것이 아니라 암호화를 해서 저장을한다.

아래 예제를 보자.

+--------------------------------------------------------------+
| password                                                     |
+--------------------------------------------------------------+
| $2b$12$UHOBo7nKHxaOZA90SVew6OrkUS6HewL2OMXYzCUJMdmqhfkkcT9Xu |
+--------------------------------------------------------------+

전혀 다른 값으로 저장이 되었다.

위 저장된 비밀번호는 다시 1234로 복원이 되면 안된다.

그말은 개발자들도 비밀번호를 알수 없다는 말이다.

이것을 단방향 암호화라고 한다.

단방향 암호화란, 평문을 암호문으로 바꾸는 '암호화'는 가능하지만, 암호문을 평문으로 바꾸는 '복호화'는 불가능한 암호화를 말한다.

단방향 해시 함수는 입력값을 문자와 숫자를 임의로 나열한 일정한 길이의 다이제스트(Digest) 형태로 변환시켜준다. 여기서 다이제스트란, 해시함수를 통해 생성된 암호화된 메시지이다.

단방향 암호화는 bruue-force attack(무차별 대입 공격)과 Rainbow table attack등에 취약하다.


인터넷에서 어떻게 암호화를 할까?

인터넷을 쓰면 인터넷 주소 앞에 https라는 것이 붙는다.

여기서 s가 secure를 의미한다. 보안이 적용된 http통신을 한다는 뜻이다.

통신을 할때 인증서롤 입혀서 통신을 하면 네트워크 통신자체가 암호화가 된다.

암호화 할때는 md5,sha-1,sha-256 등이 있는데 이것들은 단방향 암호화이다.


취약점을 보안하는 기법은 뭐가 있을까?

이세상에 절대 안풀리는 암호화는 없다.

시간만 투자하면 언젠가는 풀리는 암호화이다.

그럼 우리가 헤야하는것은 시간을 더 풀기 어렵게 만들어서 시간을 더 소모하게 하는것

위 방법에는 대표적으로 2가지가 있는데

  • Salting
  • Key Stretching
    위 두가지 기법에 대해서 알아보자.

    Salting

    Salting은 소금을 친다는 의미로 양현석 쉐프가 멋잇게 소금을 이리저리 뿌리듯 실제 비밀번호 앞뒤 아무곳에 랜덤으러 데이터를 더해서 해시값을 계산하는 방법을 말한다.

사용된 salt값은 나중에 비밀번호 일치를 확인하기 위해 같이 저장된다.

Rainbow table attack을 방지할 수 있는 효과가 있다.

Key stretching

해시 암호화를 여러번 해서 더 복잡하게 해시하는 기법이다.

무차별 대입 공격인 brute-force attack을 방지하는 효과가 있다.

그럼 이제 어떻게 위 방법을 사용하는지에 대해서 알아보자.

bcrypt를 이용한 암호화 구현

bcrypt는 Salting과 Key Stretching을 구현할 수 있는 라이브러리로 다양한 언어를 지원한다.

bcrypt는 처음부터 비밀번호를 단방향 암호화하기 위해 만들어진 해쉬 함수이며 가장 널리 쓰인다.

bcrypt는 hash 결과값에 salt값과 해시 값 및 반복 횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는 데 있어 DB설계를 복잡하게 할 필요가 없어서 암호화를 구현하는데 매우 편리하다.

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

728x90