
항해99가 시작되고 주어진 첫 과제는 '웹미니 프로젝트'.
이 과제에 필수 포함 사항 중 하나, JWT 인증 방식으로 로그인 구현하기
먼저, JWT인증 방식을 이해하기 앞서 Authentification(인증)과 Authoriztion(인가) 이 두가지 개념을 알아야한다.
Authentification(인증) = "신원확인"
: 특정 서비스에 일정 권한이 주어진 사용자임을 아이디와 패스워드를 통해서 확인 =
로그인
Authorization(인가)= "권한확인": 한 번 인증이 된 사용자가 웹사이트 내 서비스의 여러기능을 사용할 때, 로그인 된 사용자임을 확인. 즉, 로그인이 유지되는 상태에서 일어나는 일. 주로 역할에 따른 사용권한 관리
JWT는 Authentification(인증)보다는 Authorization(인가)와 연관된 기술이다.
HTTP는 상태를 저장하지 않는 것이 특징! =
Stateless
: 사용자가 로그인을 하면, '영화관 티켓'처럼 세션정보가 들어있는 표를 발급한다. 그리고 이 표의 반쪽은 사용자의 브라우져(Client)로 나머지 반쪽은 서버쪽(메모리 or 하드디스크 or 데이터베이스)에 올려둔다.

반쪽 티켓을 받은 브라우져(client)는 Session ID란 이름의 Cookie로 저장 후, 같은 사이트에 요청을 보낼 때마다 이 반쪽 티켓을 같이 보내서 사용자가 맞는지 확인한다.
장점_
: 서버 쪽 티켓반쪽에 중요정보가 있고,
Session ID자체에는 유의미한 정보를 갖지않고 있기에 안전한 편이다.단점_
- 사용자가 많아지면 메모리가 부족해질 수 있음
- 서버문제 발생으로인해 재부팅으로해야하는 경우, 메모리에 있는 데이터는 휘발성이기에 인가가 불가한 상황이 발생할 수 있음
- 메모리가 아닌 하드디스크에 넣어두는 경우, 메모리에 비해 속도가 느려짐
- 만약, 서비스 규모가 커서 서버가 여러대인 경우 각 서버 하드디스크는 다르기 때문에 인가가 제대로 안되어질 수 있음
: 로그인을 하면 Token 즉 패스권을 발급하여 준다. 이 때 서버는 세션 방식 때와 달리 어떤 것도 가져가지 않는다.

JWT은 위와 같이 3 parts로 나누어져있다. HEADER PAYLOAD VERIFY SIGNATURE
HEADER: type, alg 2가지값이 고정으로 들어가있다.PAYLOAD: 서비스가 사용자에게 이 토큰을 통해 공개하기 원하는 내용이 들어있다. ex. 유효기간, 사용자 닉네임, ID 등VERIFY SIGNATURE: HEADER + PAYLOAD + SECRET_KEY 이 세가지를 암호화 알고리즘에 넣고 돌리면 서명값이 나옴사용자가 서버에 요청을 보낼 때마다 요청과 함께 Token을 보여주고 서버는 Token 안에 저장된 값으로 VERIFY SIGNATURE을 확인하여 맞으면 응답을 준다.
장점_
- 서버는 사용자들의 상태를 기억할 필요가 없어 추가 저장소 필요 X
Stateless: 시간에 따라 바뀌는 어떤 상태값을 갖지 않는 것단점_
- 보안에 취약
- 만약, 토큰이 탈취되면 서버에는 정보를 가지고 있지않기 때문에 탈취된 토큰에 대해 통제 불가
Stateless하기 때문에 서버에서 제어 불가, 임의삭제 불가