📖 인증과 인가에 대해서 설명할 수 있다.
학습 목표
1. 인증, 인가에 대해 설명할 수 있다.
2. 단방향 해쉬가 무엇인지 설명할 수 있다.
3. salting & key stretching이 무엇인지 설명할 수 있다.
4. Bcrypt와 JWT가 무엇인지 설명할 수 있다.
access token
을 클라이언트에게 전송.access token
을 첨부해서 request를 서버에 전송함으로서 매번 로그인 해도 되지 않도록 한다.다이제스트(digest)
를 생성한다. 원본 메시지를 알면 암호화된 메시지를 구하기는 쉽지만 암호화된 메시지로는 원본 메시지를 구할 수 없어서 단방향성(one-way)
이라고 한다.0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e
값이 나온다.d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb
값이 나온다. 실제 비밀번호는 비슷하지만 해쉬 함수 값은 완전히 틀린것을 볼 수 있다. 이러한 효과를 avalance라고 하는데 비밀번호 해쉬 값을 해킹을 어렵게 만드는 하나의 요소이다.인증은 쉽게말해 로그인이라고 생각하면 됩니다. 내가 이 사이트에 가입된 회원임을, 즉 특정 서비스에 일정 권한이 주어진-
내 계정으로'만' 할 수 있는 활동을 시도할 때
사이트가 내가 로그인 되어있음을 알아보고 허가를 해주는 겁니다.
로그인이 유지되는 상태에서 일어나는 일이라고 보면 되는거죠.
정리하자면, 인증은 사용자가 자기 계정을 사용할려고 할 때 ‘인증!’ 하고 멈춰세워서 로그인을 시키는 겁니다.
인가는, 그런 인증을 받은 사용자가 서비스 한에서 돌아다닐 때 서버가 얘가 로그인을 한 사용자라는 것을 알아보고
“응~ 어서와~” 하고 허가를 해주는겁니다.
서버 부담없이 이 인가를 구현하기 위해 고안된 게 ‘토큰 방식’인 JWT입니다. JSON Web Token.
이제 사용자가 로그인을 하면 토큰이라는 표를 출력해서 건내줍니다. 대신 찢어서 주지 않고 그냥 줍니다.
서버가 뭔가를 기억하고 있지 않다는 얘기죠. 인코딩 또는 암호화된 3가지 데이터를 이어붙인겁니다.
점이 두 군데 들어가 있습니다. 마침표를 기준으로 세 부분으로 나뉘는 겁니다.
각각 header, payload, verify signature로 구분됩니다.
지금부터 1번 헤더 / 2번 페이로드 / 3번 서명 으로 부르겠습니다.
2번 페이로드부터 시작합니다. 이걸 Base64로 디코딩해보면 JSON형식으로 여러 정보들이 들어있습니다.
이 토큰을 누가 누구에게 발급했는지, 이 토큰이 언제까지 유효한지 그리고 서비스가 사용자에게 이 토큰을 통해 공개하기 원하는 내용. 이를테면 사용자의 닉네임이나 서비스상의 레벨, 관리자 여부 등을 서비스 측에서 원하는대로 담을 수 있죠. 이걸 사용자가 악용하는 것을 방지하기 위해서 1번과 3번이 있는 겁니다.
1번 헤더와 2번 페이로드, 그리고 ‘서버에 감춰놓은 비밀 값’ 이 셋을 이 암호화 알고리즘에 넣고 돌리면 3번 서명 값이 나오는 겁니다.
서버는 요청에 토큰 값이 실려들어오면 1,2번의 값을 ‘서버의 비밀 키’와 함께 돌려봐서 계산된 결과값이 3번 서명 값과 일치하는 결과가 나오는지 확인합니다. 만약 2번 페이로드의 정보가 서버가 아닌 누군가에 의해 조금이라도 수정되었다면 당연히 안 맞겠죠? 정보를 조작한 사용자이거나 해커인걸로 간주돼서 거부됩니다.
3번 서명 값과 계산 값이 일치하고, 유효기간도 지나지 않았다면 그 사용자는 로그인 된 회원으로서 인가를 받는겁니다.
이처럼 시간에 따라 바뀌는 어떤 상태값을 안 갖는 것을 stateless하다고 합니다.
좋긴하지만 이 방법에는 치명적인 결함이 있습니다.
내가 쥐고 있을 필요가 없어서 편하기는 한데, 그래서 통제는 못한다.