인증에 필요한것은?
- ID/Email : 외부에 노출이 된 개인정보
- Password : 노출안된 정보. 가장 중요하다
(문제1)메시지가 같으면 다이제스트도 동일하므로, 다이제스트 하나가 털리면 동일한 다이제스트를 사용하는 다른 사용자의 패스워드도 털려버림
(문제2)Rainbow Attack에 취약
※RainbowTable에 미리 해시해둔 패스워드를 쌓아놓고 모든 값을 대입해서 로그인 시도하는 것
Rainbow Attack
Rainbow Ta해커가 Rainbow테이블 활용해서 무작위대입으로 해시값 계산하는데 필요한 시간을 대폭 늘리기 위해,
일정길이로 해싱된 값에 salt를 붙이고 해싱하고, 그 값에 salt를 또 붙여서 해싱하는 동작을 여러번 반복함.
3개월지나면 비밀번호를 바꿔야하는 이유가 여기에 있다.
HTTP는 stateless한 특성을 지니므로, 각 통신의 상태는 저장되지 않는다.
그러나 매번 새 페이지를 요청할때마다 로그인을 해야 한다면 사용이 불가능할 것이다.
상기 문제 해결위해 Session과 Token 등장
유저의 로그인 시도 후 서버에서 일치하는 값을 찾은 후 유저에게 Session 또는 Token을 발급함.
브라우저는 request마다 해당 Session 또는 Token을 함께 보냄
Session은 서버에서 관리, Token은 웹브라우저에 저장되므로 민감정보를 담지 않고 유효기간 짧게 설정함.
짧은 유효기간으로 인한 불편함은 Refresh Token 발행하여 유효기간 연장하고 좀 더 안전한곳에 저장하도록 하여 해소.
Session은 오늘날 분산된 서버형태에서는 사용하기 어렵고 서버부하 많이 걸림. 확장성에 유연하지 못함. 이에 주로 Token을 사용함
서버는 사용자가 로그인했을 경우 headers에 메타데이터를 보내 확인하는데, 해당 메타정보를 JWT(Jason Web Token)이라고 함.
토큰이 우리서버에서 발급한게 맞는지 확인하기 위한 것.
개인정보를 담긴 담아야하는데, 우리 DB에서만 인식할 수 있는 값을 넣어준다
헤더 인코딩(암호화 아님)
BASE64
로 인코딩내용(payload) 인코딩(암호화 아님)
BASE64
인코딩함서명(signature) 암호화됨
BASE64
로 인코딩된 header
와 playload
와 JWT secret
을 헤더에 지정된 양방향 암호 알고리즘
으로 함호화하여 전송