[TIL] 인증과 인가

devCecy·2020년 12월 7일
0

TIL

목록 보기
8/17

1. 인증(Authentication)이란?

  • 인증은 회원가입과 로그인을 말한다.
  • 사용자가 서비스 제공자에게 자신을 증명하는 것.
  • 개발자 입장에서는 우리의 서비스를 누가 쓰고 어떻게 사용하는지 등이 추적하기위해 필요하다.
  • 인증에는 아이디, 이메일주소, 비밀번호 등이 있으며, 이중에 가장 중요한 것은 비밀번호다.

2. 비밀번호 암호화

2-1) 암호화란?

  • 비밀번호는 법규상의 강제되어있기에 해야한다.
  • 암호화는 개인정보취급자의 실수 또는 해커의 공격 등으로 인해 개인정보가 비인가자에게 유-노출 되더라도 그 내용을 확인하기 어렵게 하는 보안기술이다.

2-2) 비밀번호를 어떻게 관리하는가?

1) database에 저장시 개인 정보를 해싱하여 복원할 수 없도록 함
2) 통신 시 개인 정보를 주고 받을 때 SSL(인증서)을 적용하여 암호화 (HTTPS)

2-3) 암호화는 어떻게 할까요?

단방향 해쉬

해쉬(hash)함수는 자료구조에서 빠른 자료의 검색, 데이터의 위변조 체크를 위해서 쓰인다. 복원이 불가능한 단방향 해쉬함수는 암호학적 용도로 사용한다. 결과적으로 당장 식별이 불가능하지만, 같은 알고리즘으로 다시 해싱하면 항상 같은 결과가 나오기 때문에 역추적이가능하다. 이때 가능한 경우의 수를 모두 해시값으로 만들어놓은 것을 레인보우 테이블이라고 한다.

salting & Key Stretching

역추적이 가능하다는 허점을 보완하기위해 salting과 Key Stretching이라는 개념이 등장 했다.
입력한 비밀번호와 임의로 생성한 문자열(Salt)를 합쳐 해싱한 값을 저장하는 방법이다. 이때, 비교를 위해 해시값과 Salt값을 같이 저장해야한다.
여기에 해커가 패스워드 무작위 대입을 통해 해시값을 계산하는데 필요한 시간을 대폭 늘리기 위해 Salting 및 해싱을 여러번 반복해서 원본 값을 유추하기 어렵게 만드는 것을 Key Stretching이라고 한다.

bcrypt

salting & Key Stretchingt의 대표적인 라이브러리
bcrypt는 해쉬 결과값에 salt값과 해쉬값 및 반복횟수를 같이 보관하기 때문에 비밀번호에 해싱을 적용하는데 있어 DB설계를 복잡하게 할 필요가 없다.

3. 인가()란?

인가란 사용자가 서버에 로그인을 하면 해당 사용자가 맞는지 확인하는 과정을 말한다. HTTP의 stateless 특징으로 인해 필요한 과정이다.

(로그인한 사람이 추가적인 서비스를 이용할때 토큰을 가지고 서비스를 이용하는 과정?)

JWT

서버는 사용자가 로그인을 했을 때, 로그인 했다는 것을 headers에 메타데이터를 보내서 확인 할 수 있다. 이 메타정보를 바로 JWT(JSON Web Token)이라고 한다.

  • JWT를 가진 사람만 접근가능하도록 하는것이 인가의 과정이다.
  • 사용자가 로그인을하면 백엔드 개발자가 프론트엔드 개발자에게 토큰을 주며 프론트 개발자는 브라우져(세션스토리지)에 토큰을 저장한다.

JWT의 구조

  • 헤더(header)에는 토근의 타입과 해시알고리즘 정보가 들어가며, 헤더의 내용은 BASE64 방식을 인코딩해서 JWT의 가장 첫 부분에 기록된다.
  • 내용(playload)에는 exp와 같이 만료시간을 나타내는 공개 클레임과 클라이언트와 서버 협의하에 사용하는 비공개 클레임이 들어간다.
  • 서명(sigmature)은 JWT가 원본 그대로라는 것을 확인 할 때 사용한다. 프론트엔드가 JWT를 백엔드 API 서버로 전송하면 서버에서는 전송받은 JWT가 맞는지 확인한다.
    -헤더와 내용은 인코딩만하고 서명은 암호화한다.

정리,

인증은 회원가입하고 로그인하는 과정까지를 말하고,
인가는 로그인한 사람이 추가적인 서비스를 이용할때 부여받은 토큰을 가지고 서비스를 이용하는 과정을 말한다.

profile
🌈그림으로 기록하는 개발자🌈

0개의 댓글