JWT(Json Web Token)

우잼·2023년 9월 19일
post-thumbnail

1. JWT(Json Web Token)


jwt

  • Json Web Token으로 Json 객체를 이용해 데이터를 주고받을 수 있는 웹 토큰
    • header : signature를 해싱하기 위한 알고리즘 정보
    • payload : 실제로 사용될 데이터
    • signature : 토큰의 유효성 검증을 위한 문자열, 토큰이 유효한 토큰인지 검증

2. 구성


2.1. 헤더(header)

```json
{
    "typ": "JWT",
    "alg": "HS256" 
}
```
  • typ: 토큰의 타입을 지정, JWT라는 문자열이 들어감
  • alg: 해싱 알고리즘을 지정

즉, JWT 토큰으로 이루어져있고, 해싱 알고리즘으로 HS256을 사용했다는 것을 알 수 있음

2.2. 정보(payload)

  • 토큰에 담을 정보, 한 덩어리를 클레임(claim)이라고 하며, 클레임은 key-value의 한 쌍으로 이루어져있음

2.2.1 등록된(registered) 클레임

  • 토큰에 대한 정보를 담기 위한 클레임, 이미 이름이 등록되어있는 클레임
    • iss: 토큰 발급자 (issuer)
    • sub: 토큰 제목(subject)
    • aud: 토큰 대상자(audience)
    • exp: 토큰 만료시간(expiration), 시간은 date, 항상 현재 시간보다 이후
    • nbf: Not before를 의미, 토큰의 활성 날짜와 비슷한 개념, NumericDate 형식으로 날짜 지정
    • iat: 토큰 발급 시간 (isuued at)
    • jti: jwt의 고유 식별자

2.2.2. 공개(public) 클레임

  • 공개된 클레임, 충돌을 방지할 수 있는 이름을 가져야함, 클레임 이름을 URI

2.2.3. 비공개(private) 클레임

  • 클라이언트
    • 서버간에 통신을 위해 사용되는 클레임
    {
        "iss": "ajufresh@gmail.com", // 등록된(registered) 클레임
        "iat": 1622370878, // 등록된(registered) 클레임
        "exp": 1622372678, // 등록된(registered) 클레임
        "https://shinsunyoung.com/jwt_claims/is_admin": true, // 공개(public) 클레임
        "email": "ajufresh@gmail.com", // 비공개(private) 클레임
        "hello": "안녕하세요!" // 비공개(private) 클레임
    }
  • 서명 (signature)
    • 토큰이 조작되거나 변경되지 않았음을 확인하는 용도로 사용, 헤더의 인코딩 값과 정보의 인코딩 값을 합친 후에 주어진 비밀키를 통해 해쉬값을 생성
    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret)

3. JWT 동작


3.1. 동작 방식

  1. 사용자가 id, pw를 입력받아 서버에 로그인 인증을 요청
  2. 서버에서 클라이언트로부터 인증 요청을 받으면, Header, PayLoad, Signature를 정의. 헤더, 페이, 서명을 각각 Base64로 한 번 더 암호화하여 JWT를 생성
  3. Access token과 refresh token을 클라이언트에게 전달
  4. 클라이언트는 서버로 부터 받은 JWT를 로컬 스토리지에 저장
  5. Authorization header에 Acess Token을 담아서 API를 서버에 요청
  6. 서버는 클라이언트가 Header에 담아 보낸 JWT가 서버에서 발급한 토큰인지 일치여부를 확인하고 일치한다면 인증을 통과시키고 아니면 거절
  7. 인증이 통과되면 페이로드에 들어있는 유저의 정보들을 select해서 클라이언트에게 돌려줌
  8. 만약 access token 시간이 만료했다면 refresh token을 이용해서 서버로부터 새로운 acess token을 발급받음

3.2. JWT 장점

  • Header와 Payload를 가지고 Signature를 생성하므로 데이터 변조를 막을 수 이음
  • 인증 정보에 대한 별도의 저장소가 필요 없음
  • 다른 로그인 시스템에 접근 및 권한 공유가 가능

3.3. JWT 단점

  • 토큰 자체에 정보를 담고있어 양날의 검이 될 수 있음
  • 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하가 걸릴 수 있음

4. Access Token, Refresh Token


  • Access Token: 클라이언트가 가지고 있으며 실제로 유저의 정보가 담긴 토큰, 클라이언트에서 요청이 오면 서버에서 해당 토큰에 있는 정보를 활용하여 사용자 정보에 맞게 응답을 진행
  • Refresh Token: 새로운 Access Token을 발급하기 위해 사용하는 토큰, 짧은 수명을 가지는 Access Token에게 새로운 토큰을 발급해주기 위해 사용, 보통 db의 유저 정보와 같이 기록

5. Reference


🌐 JWT 토큰 인증 이란? (쿠키 vs 세션 vs 토큰)

[Spring Boot에서 JWT 사용하기]

profile
나는 재민

0개의 댓글