TIL 50 | 인증 & 인가

Saemsol Yoo·2021년 1월 31일
0

WEB

목록 보기
4/4
post-thumbnail
post-custom-banner

인증 Authentication

1. 인증이란?

인증은 유저의 identification 을 확인하는 절차이다. 그 절차의 예로 로그인회원가입 이 있다.

🤔 그럼 왜 인증을 왜 하는걸까?


1-1. 인증을 하는 이유

  • 예를들어 유료서비스 같은 경우에는 무조건 로그인을 해야만 결제를 한 유저인지 아닌지를 알 수 있기때문이다.
  • 뿐만 아니라 서비스 타겟팅을 하기 위한 정보도 알 수 있도록 추적하기 위해서 인증을 한다.

1-2. 인증에 필요한 것은?

  • 아이디
  • 이메일주소
  • 비밀번호 등

→ 이 중에서 가장 중요한 것은!! 비밀번호 이다.

비밀번호의 관리 🚨
통신과정
비밀번호는 법규상으로 DB에 암호화하여 저장이 되도록 강제되는 사항이다. 인증/인가의 과정에서 모든 유저의 데이터들은 통신과정에서 HTTPS, text로 이동하기 때문에 통신내용을 확인하고자 한다면, 무엇이 이동하는지 다 노출 될 수 있다. 그렇기 때문에 이런 개인정보를 주고받을 때에는 SSL을 적용해서 암호화를 해주어야 한다.

Database에 저장 시
이렇게 통신해서 받아온 비밀번호를 데이터베이스에 저장할 때에는 개인 정보를 해싱하여 복원할 수 없도록 해야한다.

해쉬란? 자료구조의 일종으로, 쉽게말해 해싱을 하면 기존 데이터입력값이 임의의 수학적 계산에 따라 암호화되어 바뀌는것이라고 볼 수 있다.



2. 암호화

🤔 그럼 암호화는 어떻게 하는걸까?

2-1. 단방향 해쉬

원래 hash 함수는 자료구조에서 빠른 자료의 검색, 데이터의 위변조 체크를 위해서 쓰이지만, 복원이 불가능한 이 단방향 해쉬함수암호학적 용도로 사용한다.
간단하게 단방향 해쉬를 말해보면, a를 넣으면 a' 가 나오는데, 엄청 복잡하게 바뀌어서 나오는 것을 말한다.

  • MD5 SHA-1
    → 이 둘은 너무 오랫동안 사용해오다 보니까 조금씩 밝혀지기 시작해서 보안이 취약해졌다.
    ex) 같은 숫자를 해싱하면, 언제나 같은 결과가 도출되다보니 가능한 경우의 수를 모두 해시값으로 만들어버린다면 해킹이 가능해져버린다. 😱
  • SHA-256
    만약 '1234'를 SHA-256 해싱하면 → 03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4 로 바뀐다.
    🤚🏻 하지만 이것또한 역시!! 같은 알고리즘으로 또 1234를 해싱한다면 같은결과가 도출된다...

사용자들끼리는 같은 비밀번호를 사용한다고 하더라도 백엔드는 다르게 저장해줘야 한다! 그래서 나온게SALTING & KeyStretching


2-2. SALTING & KeyStretching

salting & keystretching 이란? 말 그대로 소금을 쳐서 늘린다는 뜻이다!

  • salting
    임의로 생성한 문자열을 섞어서(random) 다시 해싱을 해준다. → 그럼 더 알 수 없게 되겠죠? 🙂
  • key stretching
    해커가 패스워드 무작위 대입을 통해 해시값을 계산하는데 필요한 시간을 대폭 늘리기 위해 salting 밑 hashing을 여러번 반복해서 원본 값을 유추하기 어렵게 만드는 것이 키 스트랫칭(key stretching)이다. 단, 반복되는 salt 값은 계속 같다

🤔 그럼 어떻게 임의로 추가한 salt값을 구분하지?
→ 그래서 DB에 salt 값도 같이 저장해준다! (보안적으로 문제 없다)

👏🏻 이 과정을 조금 더 편하게 할 수 있도록 도와주는 라이브러리가 있는데, bcrypt 이다.


2-3. bcrypt

bcrypt 는 Salting & Key Stretching 의 대표적인 라이브러리이다. 📒

  • bycrypt는 hash 결과값에 소금값과 해시값 및 반복횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는데 있어 DB설계를 복잡하게 할 필요가 없다.
  • bcrypt를 통해 해싱된 결과 값(Digest)의 구조는 아래와 같다.


3. 로그인 절차

  1. 유저 아이디와 비번 생성
  2. 유저 비번 암호화 해서 DB에 저장.
  3. 유저 로그인 -> 아이디와 비밀번호 입력
  4. 유저가 입력한 비밀번호 암호화 한후 암호화되서 DB에 저정된 유저 비밀번호와 비교.
  5. 일치하면 로그인 성공
  6. 로그인 성공하면 access token을 클라이언트에게 전송.
  7. 유저는 로그인 성공후 다음부터는 access token을 첨부해서 request를 서버에 전송함으로서 매번 로그인 해도 되지 않도록 한다.


-------------------------

인가 Authorization

1. 인가란?

사용자가 서버에 로그인을 하면 → 해당 사용자가 맞는지 확인하는 과정이 인가 (authorization) 이다.

🤚🏻 인가를 계속 알아보기 전에, 먼저 HTTP의 특징을 다시 살펴봐야한다.

1-1. HTTP 특징

HTTP 에서는 각각의 request가 독립적이어서 이전 요청을 기억하지 못한다는 특징이 있었다. 그래서 내가 아까 로그인해서 로그인 시켜줘 놓고(200ok) 다음 요청에서 또 기억을 하지 못한다. (=stateless 한 성질)

→ 그래서! 서버는 토큰을 발행해주고 두번째 요청부터는 발행받은 토큰과 함께 요청을 보내기 때문에 내가 로그인을 한 유저라는것을 알게해줄 수 있다. 💡


1-2. Json Web Token

이렇게 발행해주는 토큰이 JWT (Json Web Token) 이다.

  • 첫번째 요청에서 로그인을 인가해줄때 200OKToken 이 발행되고,
  • 두번째 요청에서부터는 이제 발행받은 이 Token 과 함께 요청을 보내게 된다.
    (jwt 는 메타정보이고, 이 메타데이터는 headers에 담겨서 보내진다.)



2. Authorization 절차

  1. Authentication 절차를 통해 access token을 생성한다. access token에는 유저 정보를 확인할 수 있는 정보가 들어가 있어야 한다 (예를 들어 user id).
  2. 유저가 request를 보낼때 access token을 첨부해서 보낸다.
  3. 서버에서는 유저가 보낸 access token을 복호화 한다.
  4. 복호화된 데이터를 통해 user id를 얻는다.
  5. user id를 사용해서 database에서 해당 유저의 권한(permission)을 확인하다.
  6. 유저가 충분한 권한을 가지고 있으면 해당 요청을 처리한다.
  7. 유저가 권한을 가지고 있지 않으면 Unauthorized Response(401) 혹은 다른 에러 코드를 보낸다.
profile
Becoming a front-end developer 🌱
post-custom-banner

0개의 댓글