본문 바로가기

스파르타 부트캠프(spring)

[내일배움캠프_Spring] 자바 Spring 입문_JWT_230104

JWT(Json Web Token)

: 토큰 기반 인증 시스템의 대표적인 구현체. 일반적으로 클라이언트와 서버 통신 시 권한 인가를 위해 사용하는 토큰

 

장점

  • 중앙의 인증 서버, 데이터 스토어에 대한 의존성 없음, 시스템 수평 확장 유리
  • Base64 URL Safe Encoding > URL, Cookie, Header 모두 사용 가능

단점

  • Payload의 정보가 많아지면 네트워크 사용량 증가, 데이터 설계 고려 필요
  • 토큰이 클라이언트에 저장, 서버에서 클라이언트의 토큰을 조작할 수 없음

 

헤더(header)

: 토큰의 타입과 해싱 알고리즘을 지정하는 정보를 포함한다.

{
"typ":"JWT",
"alg":"HS256"
}
  • typ : 토큰의 타입 지정. JWT라는 문자열이 들어가게 됨
  • alg : 해상 알고리즘을 지정
  • 위 예제는 JWT토큰으로 이루어져 있고 해당 토큰은 HS256으로 해상 알고리즘으로 사용됨

 

내용(payload)

: 토큰에 담을 정보가 들어간다.

정보의 한 덩어리 = 클레임. 클레임은 key-value의 한 쌍으로 이루어져 있다. 클레임 은 3 종류

{
"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) 클레임
}
  • 등록된(registered) 클레임
    • 토큰에 대한 정보를 담기 위한 클레임들이며, 이미 이름이 등록되어있는 클레임
    • iss : 토큰 발급자(issuer)
    • sub : 토큰 제목(subject)
    • aud : 토큰 대상자(audience)
    • exp : 토큰의 만료시간(expiraton). 시간은 NumericDate 형식으로 되어있어야 하며,(예: 1480849147370) 항상 현재 시간보다 이후로 설정되어있어야한다.
    • nbf : Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념. NumericDate 형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않는다.
    • iat : 토큰이 발급된 시간 (issued at)
    • jti : JWT의 고유 식별자로서, 주로 일회용 토큰에 사용한다.
  • 공개(public) 클레임
    • 말 그대로 공개된 클레임, 충돌을 방지할 수 있는 이름을 가져야하며, 보통 클레임 이름을 URI로 짓는다.
  • 비공개(private) 클레임
    • 클라이언트 - 서버간에 통신을 위해 사용되는 클레임

 

서명(signature)

: 해당 토큰이 조작되었거나 변경되지 않았음을 확인하는 용도.

 헤더의 인코딩 값과 정보의 인코딩 값을 합친 후 주어진 비밀키를 통해 해쉬값 생성