JWT는 편의성과 보안을위해 2가지의 토큰을 가진다.

  • Access Token
  • Refresh Token

위의 내용에 대해 좀더 자세한 내용으로는

JWT 토큰은 유저의 신원 및 권한을 결정하는 정보를 가지고 있는 데이터 조각이다.
JWT 토큰의 인증방식은 비밀키(개인키 or 대칭키)로 암호화 되어 있기 때문에 클라이언트와 서버는 안전하게 통신한다.
BUT
탈취 당한경우 문제가 발생한다고 한다
JWT 토큰을 탈취한 사람은 마치 신뢰할 사람으로 인증을 통과할 수 있기때문
심지어 본주인과 탈취한 사람인지에 대한 것을 서버는 구분할 수 없기 때문에 유효기간을 두는것이다.

유효기간이 짧은 경우 사용자가 로그인을 자주해야하므로 불편하고,
유효기간을 길게한 경우 탈취위험 노출이 크다. 
그래서 해결 방법인 토큰 2가지 (Access Token 과 Refresh Token)을 두는 것이라고 한다.

 

 

우선 핵심만 먼저 이야기하자면

 Access Token의 expiration(토큰만료시간)을  짧게 설정하고, Refresh Token의 expiration(토큰만료시간)을 길게 설정한다.

이렇게 하면 사용자의 편의성과 보안성이 증가한다.

 

 

 

토큰 관리방법

  • 로그인요청 후 정보를 비교하여 사용자로 확인된다면 Refresh Token을 발급하여 후 RefreshToken을 이용해 Access Token을 발급한다.
  • Access Token의 만료 시 Refresh Token을 비교후 일치 시 access token을 발급한다.
  • 클라이언트는 헤더(header)에 Access Toekn은 넣고 API 통신을 진행한다. (Authorization)
  • 서버의 경우 Refresh Token을 저장하고 있는다.
  • Refresh Token의 만료가 된경우 재로그인을 하도록 조치한다.

 

 

Access Token과 Refresh Token을 이용한 인증 절차 

1. Access Token 전송 시 만료 시간에 의한 실패의 경우 Refresh Token을 체크한다.

2. Refresh Token이 일치 한 경우 Access Token을 자동으로 발급하여 새로운 만료시간을 갖는다. (사용자는 로그아웃 X)

= Access Token가 탈취 된 경우 만료시간이 짧아 보안성이 좋음

= Refresh Token의 경우 위험

 

 

Refresh Token

저장위치 : 서버 즉 DB에 저장

→ Local Storage와 Cookie 보다 보안성이 좋음

토큰이 저장된 DB의 인뎃스 값을 Local Stoage나 Cookie에 저장

-> 인덱스 값을 hash 처리해서 보관 시 더욱 우수한 보안을 가질 수 있음. => DB는 Refrsh Token을 보관하는 곳을 HashMap, HashTable로 구현하게됨

 

 

'jwt' 카테고리의 다른 글

1. Jwt 개념정리  (0) 2024.01.06

1. JWT (Json Web Token)이란?


[JWT 개념]

JWT(JSON WEB TOKEN)이란 Json 포맷을 이용하여 사용자에 대한 속성으 저장하는 Claim 기반의 Web Token이다.

JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달한다.

주로 회원인증이나 정보전달 사용한다.

 

 

2. JWT 구조


[JWT 개념]

JWT의 구조는 3가지 부분으로 이루어지며 각각 Json 형태인 각부분은 Base64URl로 인코딩 되어 표현된다.

또한 각부분을 이어주기 위해 .(점)을 구분자로 사용한다.

  • Header (헤더)
  • Payload (페이로드)
  • Signature (서명)

JWT의 구조

 

1. Header

구조는 typ와 alg로 구성됨

  • typ : 토크의 타입지정 ex) JWT
  • alg : 알고리즘 방식을 지정하며, Signature(서명) 및 토큰 검증에 사용됨 ex) H256(SHA256) or RSA

 대표적으로 사용되는 알고리즘 (alg)은 아래의 리스트들이 있다

  • HMAC
  • SHA256
  • RSA
  • HS256 OR RS256
{
  "alg" : "HS256",
  "typ" : "JWT"
}

 

 

2.Payload

토큰에서 사용할 정보의 조각들인 Claim(클레임)이 담겨 있다. 
Claim은 name/value의 한 쌍으로 이루어져 있다.
{
  "sub": "1234567890", // 등록된 플레임
  "name": "John Doe", // 비공개 플레임
  "iat": 1516239022  // 등록된 플레임
}​

Claim은 3가지로 나누어 진다
  • 등록된 클레임 (Registered)
  • 공개 클레임 (Public)
  • 비공개 클레임 (Private)
1. 등록된 클레임 (Registered Claim) 
토큰의 정보를 표현 하기 위해 이미 정해진 종류의 데이터 (7종류가 있다)
선택적으로 작성가능 하며, key의 길이는 간결성을 위해 String이 3의 길이이다.
  • iss : 토큰 발급자 (issuer)
  • sub : 토큰의 제목 (subject) - unique한 값 사용, 사용자의 email 주로 사용
  • aud : 토큰의 대상자 (audience)
  • nbf : 토큰 활성날짜 (notbefore) - 이날이 지나기전 토크 활성화 되지 않음
  • exp: 토큰 만료시간 (expiration) - numericDate형식으로 되어 있어야함
  • iat : 토큰 발급시간 (issued at) - 토큰 발급 이후의 경과시간을 알 수 있음
  • jti : JWT 토큰 식별자 (JWT Id) -  중복 방지를 위해 사용, 일회용토큰(access Token)등에 사용됨

2. 공개 클레임 (Public Claim)
사용자 정의 클레임
공개용 정보를 위해 사용하며 충돌방지를 위해 Url 포맷을 이용
{
  "https:yongoh1253.tistory.com":true
}


3. 비공개 클레임 (Private Claim)
사용자 정의 클레임
서버와 클라이언트 사이에 임의로 지정한 정보를 저장

{
  "name": "John Doe"
}​

 

3. Signature (서명)

토큰을 인코딩하거나 유효성 검증을 할때 사용하는 고유화한 암호화 코드
Header와 Payload의 값을 각각 Base64Url로 인코딩하고 인코딩한 값을 다시 비밀키를 이용해 Header에서 정의한 알고리즘으로 해싱하고 이 값을 다시 Base64Url로 인코딩하여 생성
생성된 토큰은 Http 통신을 할때 'Authorization'이라는 key의 value로 사용
→ 일반적으로 value앞에 'Bearer '이 붙음
{
  "Authorization" : "Bearer {생성된 토큰 값}"
}

 

 

'jwt' 카테고리의 다른 글

jwt를 이용한 개발 시 이해한 내용 정리  (0) 2024.01.07

+ Recent posts