1) 사용자는 id와 pw를 입력하여 로그인 요청을 시도한다.
2) 사용자의 id와 pw를 받은 서버는 시큐리티 등을 통해 사용자 인증 로직을 수행한다.
1) 서버는 사용자 인증이 정상적으로 완료되면 JWT(Json Web Token)를 생성한다.
2) JWT를 사용자에게 반환한다. (사용자의 브라우저에 저장)
JWT (Json Web Token)의 구조는 다음과 같다.
{
"alg": "HS256",
"typ": "JWT"
}
JWT의 Header에는 토큰의 타입과 해싱 알고리즘이 포함된다.
{
"sub": "1234567890",
"iss": "test.com",
"https://test.com/jwt": true,
"exp": "1485270000000",
"name": "hong-gildong"
}
JWT의 Payload에는 토큰에 담을 정보가 들어있다. 여기에 담는 정보를 클레임이라 하며 클레임의 종류는 크게 세 종류로 나뉘어져있다.
"Authorization": "Bearer {생성된 토큰 값}",
JWT의 Signature는 Header와 Payload를 조합한 후, Secret Key를 사용해 해싱한 결과이다. 서버 측에서는 토큰이 변조되지 않았는지 확인하기 위해 Signature를 검증한다. Signature는 Header와 Payload를 Base64Url로 인코딩한 후, Secret Key를 사용해 해싱한 값이다.
1) 서버는 JWT를 생성할 때, 헤더와 페이로드를 서버의 개인키로 해싱하여 시그니처를 생성한다. 이렇게 생성된 JWT를 사용자에게 발급한다.
2) 사용자는 이후 요청 시, 발급받은 JWT를 인증 수단으로 사용하기 위해 헤더에 JWT 넣어서 서버에게 전달한다.
3) 서버는 사용자로부터 받은 JWT의 헤더와 페이로드를 base64로 디코딩하여 1번의 과정과 마찬가지로 서버가 가지고 있는 개인키로 해싱하여 시그니처값이 같은지를 검증한다.
4) 검증이 성공하면 정상적으로 요청이 처리되며, 검증에 실패하면(시그니처 값이 다름) 위변조로 간주하고 인증 실패 처리한다.