JWT(Json Web Token) 발급과 검증 방식

eomprgrm·2023년 4월 15일
0

1. JWT 발급 과정


사용자 인증 요청

1) 사용자는 id와 pw를 입력하여 로그인 요청을 시도한다.
2) 사용자의 id와 pw를 받은 서버는 시큐리티 등을 통해 사용자 인증 로직을 수행한다.

사용자 인증 완료 (토큰 발급)

1) 서버는 사용자 인증이 정상적으로 완료되면 JWT(Json Web Token)를 생성한다.
2) JWT를 사용자에게 반환한다. (사용자의 브라우저에 저장)

2. JWT 구조


JWT (Json Web Token)의 구조는 다음과 같다.

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

JWT의 Header에는 토큰의 타입과 해싱 알고리즘이 포함된다.

payload

{
  "sub": "1234567890",
  "iss": "test.com",
  "https://test.com/jwt": true,
  "exp": "1485270000000",
  "name": "hong-gildong"
}

JWT의 Payload에는 토큰에 담을 정보가 들어있다. 여기에 담는 정보를 클레임이라 하며 클레임의 종류는 크게 세 종류로 나뉘어져있다.

  • registerd claim (등록된 클레임)
    • 토큰에 대한 정보를 담은 클레임이다. 토큰 발급자, 토큰 제목, 만료시간 등이 있다.
  • public claim (공개 클레임)
    • 충돌 방지를 위해 URI를 namespace 형식으로 작성한다.
  • private claim (비공개 클레임)
    • 이외의 정보를 포함한다. 주로 클라이언트와 서버 간에 협의로 사용되는 클레임이다. public claim과 마찬가지로 namespace 형식으로 작성한다.

signature

"Authorization": "Bearer {생성된 토큰 값}",

JWT의 Signature는 Header와 Payload를 조합한 후, Secret Key를 사용해 해싱한 결과이다. 서버 측에서는 토큰이 변조되지 않았는지 확인하기 위해 Signature를 검증한다. Signature는 Header와 Payload를 Base64Url로 인코딩한 후, Secret Key를 사용해 해싱한 값이다.

3. JWT 검증


1) 서버는 JWT를 생성할 때, 헤더와 페이로드를 서버의 개인키로 해싱하여 시그니처를 생성한다. 이렇게 생성된 JWT를 사용자에게 발급한다.
2) 사용자는 이후 요청 시, 발급받은 JWT를 인증 수단으로 사용하기 위해 헤더에 JWT 넣어서 서버에게 전달한다.
3) 서버는 사용자로부터 받은 JWT의 헤더와 페이로드를 base64로 디코딩하여 1번의 과정과 마찬가지로 서버가 가지고 있는 개인키로 해싱하여 시그니처값이 같은지를 검증한다.
4) 검증이 성공하면 정상적으로 요청이 처리되며, 검증에 실패하면(시그니처 값이 다름) 위변조로 간주하고 인증 실패 처리한다.

profile
성실하고 둥글게 살고자 하는 개발자입니다.

0개의 댓글