이전 프로젝트에서 담당하지 않게 되어서 아쉬웠던 부분이 로그인이였다.
취준 하면서 시간이 여유로울 때 아쉬웠던 부분을 보완하고 싶어서 직접 로그인을 구현해 보려고 한다.
유튜브에서 아주대학교의 유튜브에 관련된 강의를 업로드 해서 이를 따라해보며 부족한 부분은 검색을 통해 해결해 보려고 한다.
JWT토큰은 HEADER, PAYLOAD, VERIFY SIGNATURE로 이루어져 있다.
{
"alg": "HS256",
"typ": "JWT"
}
Header에는 보통 토큰의 타입이나, 어떤 알고리즘으로 서명을 생성했는지 저장한다. 위 예시에는 토큰의 타입이 JWT이고 HS256 알고리즘으로 암호화가 된 것을 볼 수 있다.
{
"iss": "https://auth.example.com", // Registered Claim
"exp": 1672531199, // Registered Claim
"https://example.com/role": "admin", // Public Claim
"https://example.com/language": "en", // Public Claim
"custom:internal_flag": "true", // Private Claim
"custom:feature_access": "premium" // Private Claim
}
Payload 부분에는 토큰에 담을 정보가 들어가있다. claim은 name/value 한쌍으로 이뤄져있다.
이 claim은 registered
, public
, private
3가지로 나뉜다.
registered
: 토큰에 대한 정보를 담기 위해 이미 이름이 정해진 클레임이다.(모두 Optional하다.)
public
: 표준이 아닌 추가 데이터를 포함할 수 있는 클레임이다. 충돌이 방지된 이름이 가지고 있어야 한다. 그로 IANA에서 등록하거나, 이름이 고유한 네임스페이스를 사용하는 것이 권장되기에 URI를 사용한다.
private
: 양 측(서버 - 클라이언트) 협의 하에 사용되는 클레임 이름이다.
이 부분은 Header의 인코딩 값과, Payload의 BASE64Url인코딩 값을 합친 후 Header에 쓰여진 알고리즘과 주어진 비밀키로 해쉬를 생성한다.
Header와 Payload는 암호화 되지 않기 때문에 민감 정보를 담으면 안된다.
Http 연결을 기본적으로 stateless하다. 내가 인증된 사용자 라는것을 서버에 알리기 위해서 JWT 토큰을 사용한다. Authorization 헤더에 토큰을 넣고 요청을 보내면 서버에서는 이 토큰을 검증한 이유에 유효하면 요청을 수행한다.