Spring Boot - JWT (이론)

김명식·2023년 5월 24일
1

Spring Boot

목록 보기
10/11
post-thumbnail

Json Web Token (JWT)

JWT클라이언트와 서버간의 인증과 정보 교환안전하게 수행하기 위한 표준 방법이다.
정보를 안전하게 전달하기 위해 "전자 서명"된 JSON 객체로 표현된다.

전자 서명 ? 
전자 서명이란 {헤더}, {페이로드}와 시크릿 키를 이용해 해시 함수에 돌린, 즉 암호화한 결괏값이다.
시크릿 키란 나만 알고있는 문자열, 비밀번호 같은 것이다.
너무 간단하지 않으면 아무거나 상관없다.

JWT는 총 3가지 부분으로 구성된다.

1. 헤더 (Header)

  • JWT의 헤더는 토큰의 유형서명 알고리즘을 지정한다.
    헤더는 JSON 객체로 표현되며, 일반적으로 두개의 속성을 가진다.

    • typ :
      Type을 줄인 말, 이 토큰의 타입을 의미한다
    • alg :
      Alogithm을 줄인 말,
      토큰의 서명을 발행하기 위해 사용된 해시 알고리즘의 종류를 의미.

2. 페이로드 (PayLoad)

  • JWT의 페이로드는 토큰에 포함되는 클레임(claim)정보를 담고있다.
    • sub :
      Subject를 줄인 말, 이 토큰의 주인을 의미한다.
      sub는 ID처럼 유익할 식별자여야 한다.
    • iss :
      Issuer를 줄인 말, 이 토큰을 발행한 주체를 의미한다.
      예를 들어 페이스북이 이 토큰을 발행한다면 주체가 facebook이 된다.
    • iat :
      issued at을 줄인 말, 토큰이 발행된 날짜와 시간을 의미한다.
    • exp :
      expiration을 줄인 말, 토큰이 만료되는 시간을 의미한다.

3. 서명 (Signature)

  • 서명은 헤더, 페이로드 및 비밀 키를 사용하여 생성된다.
    서명은 토큰이 유효하고 변조되지 않았음을 검증하는 데 사용된다.

JWT의 인증 과정을 로그인을 예로 들어 설명하면,

  1. 최초 로그인서버사용자의 아이디와 비밀번호서버에 저장된 비밀번호에 비교해 인증한다.

  2. 인증된 사용자인 경우, 사용자의 정보를 이용해 {헤더}.{페이로드} 부분을 작성한다.

  3. 자신의 시크릿 키로{헤더}.{페이로드} 부분을 전자 서명한다.

  4. 전자 서명의 결과로 나온 값을 {헤더}.{페이로드}{서명}으로 이어붙이고,
    Base 64로 인코딩 한 후 반환한다.

  5. 이후 누군가 이 토큰으로 리소스 접근을 요청하면
    서버는 이 토큰을 Base64로 디코딩해서 얻은 JSON을
    {헤더}{페이로드}{서명} 부분으로 나눈다.

  6. 서버는 {헤더}.{페이로드}와 자신이 갖고 있는 시크릿키로 전자 서명을 만든 후 ,
    방금 만든 전자 서명을 HTTP 요청이 가지고온 {서명}부분 과 비교하여 유효성을 검사한다.

    서버가 방금 시크릿키를 이용해 만든 전자서명과 HTTP 요청의 {서명} 부분이 일치하면
    토큰이 위조되지 않았다는 뜻이다.


누군가 토큰을 훔쳐가면 어떻게 될까?
토큰을 훔쳐가면 당연히 해당 계정의 리소스에 접근할 수 있게 된다.
그렇기 때문에 반드시 HTTPS(SSL/TSL)를 통해 통신해야한다.

HTTPSHTTP보안버전으로,
암호화된 통신을 제공하여 데이터의 기밀성무결성을 보호한다.

profile
BackEnd & AWS Developer

0개의 댓글