JWT( JSON WEB TOKEN)
JWT란 서버와 클라이언트 간 정보를 주고 받을 때 HTTP Request Header에 넣어 주는 JSON 토큰을 말한다. 토큰을 사용하여 서버는 별도의 인증 과정 없이 토큰 정보만으로 인증을 처리할 수 있게 된다.
JWT의 종류
1. Access Token
2. Refresh Token
Access token은 보호된 정보들(유저의 이메일, 연락처, 사진 등)에 접근할 수 있는 권한부여에 사용한다. 클라이언트가 처음 인증을 받게 될때(로그인 시), access, refresh token 두가지를 다 받지만, 실제로 권한을 얻는 데 사용하는 토큰은 access token 이다.
1.Header
Header는 이것이 어떤 종류의 토큰인지, 어떤 알고리즘으로 sign(암호화)할지가 적혀있다.
JSON Web Token이라는 이름에 걸맞게 Json형태로 이런 형태를 볼 수 있다.
{
"alg": "HS256",
"typ": "JWT"
}
2. Payload
Payload에는 정보가 담겨 있다. 어떤 정보에 접근 가능한지에 대한 권한을 담을 수도 있고, 사용자의 유저 이름 등 필요한 데이터는 이곳에 담아 암호화 시킨다. 물론 암호화(헤더에서 정의한)가 될 정보지만, 민감한 정보는 되도록 담지 않는 것이 좋다.
{
"sub": "someInformation",
"name": "phillip",
"iat": 151623391
}
3. Signature
Signature은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드다.
서명은 위에서 만든 헤더와 페이로드의 값을 각각 BASE64로 인코딩하고, 인코딩한 값을 비밀 키를 이용해 헤더에서 정의한 알고리즘으로 해싱을 하고 이값을 다시 인코딩하여 생성한다.
JWT과정 & 토큰기반 인증절차
JWT는 권한 부여에 굉장히 유용하다. 새로 다운받은 A라는 앱이 Gmail과 연동되어 이메일을 읽어와야 한다고 생각해 봤을때
1. 클라이언트가 서버에 아이디/비밀번호를 담아 로그인 요청을 보낸다.
2. 아이디/비밀번호가 일치하는지 확인하고, 클라이언트에게 보낼 암호화된 토큰을 생성한다.
👉 access/refresh 토큰을 모두 생성한다.
토큰에 담길 정보는 유저를 식별할 정보,권한이 부여된 카테고리(사진,연락처,기타등등)
3. 토큰을 클라이언트에게 보내주면, 클라이언트는 토큰을 저장한다.
👉 저장위치는 local storage, cookie, react의 state 등 다양하다.
4. 클라이언트가 HTTP헤더(authorization 헤더)에 토큰을 담아보낸다.
5. 서버는 토큰을 해독하여 토큰이 맞는지 안맞는지 판단을 내려 클라이언트에게 요청을 처리한 응답을 보내준다.