jwt란?
jwt는 JSON Web Token의 약자로 인증에 필요한 정보들을 암호화시킨 토큰을 말하며 accessToken으로 사용한다.
jwt를 생성하기 위해서는 Header(헤더), Payload(페이로드), VerigySignature(서명) 객체가 필요하다.
jwt의 구성
Header
어떠한 알고리즘으로 암호화 할 것인지, 어떠한 토큰을 사용할 것 인지에 대한 정보가 들어있다.
1
2
3
4
{
'alg': 'HS256',
'typ': 'JWT'
}
Payload
Payload는 토큰에 담을 정보를 포함합니다. 백엔드에서 사용자의 이름이나 사용자의 권한을 담아준다면 디코딩해서 사용 가능하다. 디코딩 방법
1
2
3
4
5
6
{
'sub': '1234567890',
'name': 'John Doe',
'admin': true,
'iat': 1516239022
}
Verify Signature
Verify Signature는 Payload가 위변조되지 않았다는 사실을 증명하는 문자열입니다. Base64 방식으로 인코딩한 Header, Payload 그리고 SECRET KEY를 더한 후 서명됩니다.
1
2
3
4
5
HMACSHA256 {
base64UrlEncode(header) + '.' +
base64UrlEncode(payload),
your-256-bit-secret
}
Access Token + Refresh Token
accessToken만 사용하면 보안에 취약한데 유효기간을 짧게하면 보안성은 올라가지만 사용자는 로그인을 자주 해야해서 새로운 accessToken을 발급받아야 하는데 그것을 해결해주는게 refreshToken이다.
- 1. (Front) 사용자 로그인 요청
- 2. (Back) server에서는 DB에서 회원 값을 비교
- 3. (Back) 값이 일치한다면 accessToken, refreshToken을 발급하여 응답 Header에 실어 보낸다. 이때 일반적으로 DB에 refreshToken을 저장해둡니다.
- 4. (Front) refreshToken을 안전한 저장소에 저장 후 accessToken을 권한이 필요한 요청 Header에 실어 보낸다.
- 5. (Back) accessToken을 검증하여 성공시 데이터 보내주기
- 6. (Back) accessToken이 만료됬다면 권한 없음을 보낸다.
- 7. (Front) refreshToken, accessToken을 Header에 실어 보낸다.
- 8. (Back) accessToken이 조작되지 않았는지 확인한 후 Header의 refreshToken과 사용자의 DB에 저장되어 있던 refreshToken을 비교 refreshToken이 동일하고 유효기간도 지나지 않았다면 새로운 accessToken을 발급해줍니다.
- 9. (Back) 새로운 accessToken을 Header에 실어 다시 API 요청을 진행
마치며
혹시 잘못된 정보나 궁금하신 게 있다면 편하게 댓글 달아주세요.
지적이나 피드백은 언제나 환영입니다.