JWT Token(+로그인)

 

졸업작품을 하면서 로그인을 자체 로그인으로 구현했었는데 최근에 JWT Token을 사용하기로 했다.

처음 사용해보는거라 개념부터 정리해보려 한다.

⭐️ JWT Token?

JSON Web Token의 약자로 Json 객체에 인증에 필요한 정보를 담은 후 비밀키로 서명한 토큰이다.

=> 인증에 필요한 정보들을 암호화시켜서 Token에 담아 사용하는 것이다.

 

구성은 header, payload, signauture로 되어 있고, 점을 통해 구분된다.

- header

토큰 타입이나, 서명에 어떤 알고리즘이 사용되어 있는지 등을 저장한다.

{
  "alg": "HS256",
  "typ": "JWT"
}

alg는 어떤 알고리즘을 사용했는지, typ는 타입의 값을 나타낸다.

 

- payload

토큰에서 사용할 정보의 조각들인 claim이 담겨있다. claim은 key-value 형태이다.

가장 중요한 점은 payload에는 민감한 정보를 담지 않는다는 점이다!!

jwt 토큰을 해석해주는 사이트에 토큰을 긁으면 너무나도 쉽게 해석해주기 때문이다.

(https://jwt.io 토큰 생성/해석 해주는 사이트)

따라서 식별을 위한 정보만 저장하도록 해야한다.

 

- signature

가장 민감한 부분이다. 

header를 디코딩한 값, payload를 디코딩 한 값 + 서버가 가지고 있는 개인 키를 암호화한 값을 가지고 있다.

header와 payload는 정말 쉽게 디코딩 할 수 있지만,

signature은 서버에 있는 개인 키로만 디코딩할 수 있다. 

 

⭐️ Access Token과 Refresh Token

유효기간이 다른 JWT 토큰을 2개 사용함으로써, 토큰이 탈취당하는 상황에 대비한다.

- Access Token은 유효기간이 짧다. (ex - 2시간)

- Refresh Token은 유효기간이 길다. (ex - 1주일)

 

Access Token을 사용해서 인증을 하다가,

Access Token의 유효기간이 만료되면 Refresh Token을 통해 Access Token을 갱신한다.

 

⭐️ 토큰을  사용한 로그인 과정

  1. 클라이언트 -> 서버로 로그인 요청을 보낸다.
  2. 로그인 인증이 성공되면, 서버로부터 Access Token과 Refresh Token을 발급받는다.
  3. 클라이언트는 두 개의 토큰을 로컬에 저장해둔다.
  4. 인증이 필요할 때, 요청 헤더에 Access Token을 넣어서 보낸다.
    ( 만약, Access Token이 유효한 경우에는 여기서 통신이 완료된다. )
  5. Access Token이 만료되었다면, 헤더에 Access Token 대신 Refresh Token을 넣어서 요청을 보낸다.
  6. Refresh Token으로 사용자를 확인한 후, 응답쿼리 헤더에 새로운 Access Token을 넣어서 응답한다.
    ( 만약, Refresh Token이 유효한 경우에는 여기서 통신이 완료된다. )
  7. Refresh Token이 만료되었다면, 클라이언트는 다시 로그인을 해야한다.

 

토큰을 탈취한 사람이 토큰의 만료기간을 늘리고 싶어한다고 가정해보자.

그럼 payload에 담겨있는 만료 기간을 조작할 것이다.

하지만 payload의 값을 조작한다해서 signature의 값은 바뀌지 않는다.

signature에는 인코딩된 payload의 값이 존재하는데,
payload 조작으로 payload에 저장된 값과 signature의 값이 일치하지 않기 때문에 서버에서는 권한을 주지 않는 것이다.

 

 

'WEB' 카테고리의 다른 글

DNS  (0) 2024.06.16
HTTP/HTTPS  (0) 2024.06.10
PWA란?  (0) 2023.05.14
CORS? 어떻게 해결하지?  (0) 2023.05.10
Node.js vs 브라우저 환경  (0) 2023.05.08