TIL - 40 인증 인가 - 1

이동근·2021년 2월 2일
0

이론

목록 보기
1/2

인증과 인가

인증(Authentication)

인증은 회원가입과 로그인을 말합니다.

왜 필요한가? - 우리 서비스를 누가 쓰는지? 어떻게 사용하는지? 추적이 가능하도록 하기위해 필요

인증에 필요한 것은 무엇이 있나요?

  • 아이디, 이메일주소, 비밀번호 등이 있습니다.
  • 이중에서 가장 중요한 것은 비밀번호 입니다.

로그인 절차

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

비밀번호 관리

법규상의 관리

개인정보 보호법
database에 저장 시 개인 정보를 해싱하여 복원할 수 없도록 함 - 절대 복원 할 수 없게 만들어야 한다.
통신시 개인 정보를 주고 받을때 SSL을 적용하여 암호화(HTTPS)

단방향 해쉬(one-way hash function)

  • 원본 메시지를 변환해서 암호화된 메시지인 digest(다이제스트)를 생성한다. 원본 메시지를 알면 암호화된 메시지를 구현하기는 쉽지만 암호화된 메시지로는 원본 메시지를 구할 수 없다.

  • 해쉬 - 자료구조에서 빠른 자료의 검색, 데이터의 위변조 체크를 위해서 쓰여집니다.

  • 복원이 불가능한 단방향 해쉬함수는 암호학적 용도로 사용합니다.
    (MD5,SHA-1(보안 취약- 지금음 사용 x), SHA=256)
    ex)
    1234를 SHA-256해싱하면 다음과 같습니다.
    -> 03ac674216f3e15c761ee1a5e255f067953623c8b388b459e13f978d7c846f4
    결과만 봐서는 당장 식별이 불가능하므로 완벽해 보입니다.
    하지만 같은 알고리즘으로 1234 다시 해싱하면 항상 같은 결과가 도출됩니다. - > 노가다로 해킹 가능

추가!!!
avalance - 실제 비밀번호는 비숫하지만 해쉬 함수 값은 완전히 틀리다.

test password
0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e 

test2 password
d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb

-> 기존의 패스워드는 비슷하지만 해쉬값은 완전히 다르다.

취약점

역으로 생각해 해쉬값만 알면 기존의 비밀번호를 알 수 있기 때문에 그 내용을 정리해 놓은 테이블이 있다.
(Rainbow Table)
해쉬함수는 원래 패스워드를 저장하기 위해 만든 것이 아니라 검색을 빠르게 하기 위해 설계된 것이다. 그래서 해시 함수는 본래 처리속도가 최대한 빠르게 설계 되었다. 이 점을 공격자가 공략해, MD5(공격용 컴퓨터)는 1초에 56억개....????의 다이제스트를 대입할 수 있다 즉 대입하는데 시간이 얼마 걸리지 않는다. 그리고 사용자들은 비밀번호를 한 비밀번호로 돌력막기 하기 때문에 한개가 뚤리면 거의 다 뚤린다.

해결책 - SALTING KeyStretching?

소금치고 늘린다.?

  • Salting : 실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시값을 계산하는 방법
  • 입력한 비밀번호와 임의로 생성한 문자열(Salt)를 합쳐서 해싱해서 이 해시값을 저장하는 방법
  • 물론 이때에 비교를 위해 해시값과 소금(Salt)값을 같이 저장해야 합니다.

-Key Stretching : 해커가 패스워드 무작위 대입을 통해 해시값을 계산하는데 필요한 시간을 대폭 늘리기 위해 Salting및 해싱을 여러번 반복해서 원본 값을 유추하기 어렵게 만드는 것이 키 스트랫칭(Ket Strctching)입니다. 이 작업을 통해 1초에 56억번이 1초에 5번만 비교하도록 해줄 수 있다?

bcrypt(비크립트)

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

  • bcrypt는 앞서 말한 개념들을 실제로 적용하기 편하게 해주는 대표적인 라이브러리
  • 다양한 언어들을 지원하고 있으며, 사용이 간편하여 쉽게 적용이 가능합니다.
  • bcrypt는 hash 결과값에 소금값과 해시값 및 반복횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는데 있어 DB설계를 복잡하게 할 필요가 없습니다.

인가(Authorization)

사용자가 서버에 로그인 하면 해당 사용자가 맞는지 확인하는 과정

HTTP의 특징

  • 바로 request/response 요청과 응답
  • stateless한 성질(저장하지않는 성질)
    • http request가 독립적이어서 앞서한 request를 기억하지 못한다.
    • 로그인시 받은 티켓 = 토큰 JWT(JSON Web Token)

JWT

aaaaaa.bbbbbbb.ccccc (header, payload, signiture)

  • 토큰의 타빙과 해시알고리즘 정보가 들어갑니다.
  • 헤더의 내용은 BASE64방식으로 인토딩해서 JWT의 가장 첫 부분에 들어갑니다.

Payload

  • 내용에는 exp와 같이 만료시간을 나타내는 공개 클레임
  • 그리고 클라이언트와 서버간 협의하에 사용하는 비공개 클레임
  • 위의 두가지 요소를 조합아여 작성한뒤 BASE64인코딩하여 두번째 요소로 위치합니다.
  • 누구나 다 볼 수 있기 때문에 txt정보가 들어간다.
  • 민감한 정보는 넣으면 안된다. 누군지 명확하되 다른사람이 봐도 모르는 정도
  • 토큰의 종류는 여러가지이다.

signiture

  • JWT가 원본 그대로 라는 것을 확일할때 사용하는 부분
  • 시그니처는 BASE64URL 인코드된 header와 payload 그리고 JWT secret을 헤더에 지정된 암호 알고리즘으로 암호화하여 전송합니다.
  • 프론트엔드가 JWT를 백엔드 API서버로 전송하면 서버에서는 전송받은 JWT의 서명부분을 복호화
  • 마치 계약서의ㅏ 위변조를 막기위해 서로 사인 하는것
  • header와 payload는 암호화가 되는 것이 아님 signiture 부분만 암호화가 됨

토큰의 저장0은 FE 개발자 마음대로 정한다. 약속해서 저장한다.

profile
하루하루 1cm 자라는 개발자

1개의 댓글

comment-user-thumbnail
2021년 2월 10일

잘 보고 갑니다~

답글 달기