ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JWT(JSON Web Token) 이란
    개발공부 2023. 5. 31. 00:47

    JWT 란?

    JWT란 인증에 필요한 정보를 암호화한 JSON 토큰을 의미한다. 이를 사용한 인증 방식은 JWT 토큰을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는것을 의미한다.

    JSON 데이터가 헤더로 전송될 수 있게 * base64 url safe  형식으로 인코딩 한다. 이렇게 JWT를 서버로 전송하여 검증이 완료되면 로그인 등의 처리를 하는 인증방식이다.

     

    * base 64는 binary 데이터를 아스키 코드로 바꾸는 인코딩 형식을 의미한다. 근데 이중에서 62,63번째 문자가 +, / 이기 때문에 웹으로 전송하면 정상적으로 전송이 되지 않는 경우가 있다. 이를 -와 _로 바꿔 표현한 것이 url safe 방식이다

    base62(+와 /가 아예 빠지는 62진수 표현) 역시 사용 가능하다.

     

    쿠키 / 세션 / 토큰 차이

    쿠키

    쿠키는 K-V 형식으로 데이터를 저장 기록하는 파일이며, 사용자의 컴퓨터 내에 저장해도 되는 정보를 헤더의 cookie에 담아 보낸다. 보통 보안과 상관 없는 정보를 클라이언트에 저장하여 편의성을 높이는 식으로 사용한다.

    특히, 쿠키는 사용자 혹은 다른사람이 조회하거나 수정을 할 수 있으므로 보안과 관련된 정보는 쿠키를 사용하면 좋지 않다.

     

    세션

    세션은 클라이언트의 보안과 관련된 정보 등을 웹서버에서 보관하고 관리하는 방식이다. 로그인에 성공하면 사용자에게 session Id를 보내주고, 이를 서버에 저장된 session Id와 비교하여 인증을 하는 방식이다.

    웹 서버에서 보관을 하는만큼 쿠키보다 보안성이 좋으며 세션id만으로 유의미한 개인정보가 있진 않으나 보안문제가 완벽한것은 아니며, 웹 서버에서 확인, 관리하는 만큼 서버에 부하가 많이 간다.

     

    토큰

    토큰은 세션과 비슷하게 사용자가 로그인에 성공하면 session Id 대신 토큰을 보내준다. 이후 사용자가 서버에 요청을 보낼때 토큰을 확인한 후 인증 과정을 처리하며 진행하는 방식이다. 다른점은 토큰 자체에 데이터가 있으며, 사용자측에 저장되는 만큼 세션보다 서버의 부담이 덜하다. 단, 토큰 자체에 데이터가 있는 만큼 탈취시 보안 문제가 발생할 수 있으므로 만료 기간을 짧게 설정해 사용하는것이 권장된다.

     

    토큰이 자주 쓰이는 환경은 앱과 서버의 통신환경으로, 웹과 다르게 앱에서는 쿠키와 세션이 없기 때문이다.

     

    JWT

    토큰 형식의 JWT를 좀더 자세히 보자면 

        헤  더          페  이  로  드         전 자 서 명

    aaaaaaaaaa.bbbbbbbbbbbbbb.cccccccccccccc

     

    세가지의 부분으로 나눠져있으며 각 파트는 .을통해서 나눠진다.

    헤더에는 토큰의 타입과 해시 알고리즘의 종류로 구성되어있다. 토큰의 타입은 JWT인지 혹은 다른 토큰인지를 나타내며

    알고리즘은 SHA256, HMAC, RSA 등의 암호화 알고리즘이 무엇인지에 대한 정보가 담겨있다.

     

    두번째로 페이로드에선 사용에 있어 전송되는 데이터로, 실제 사용될 정보를 담고 있다.

    페이로드에 담는 정보의 한 조각은 K-V값으로 되어있으며 클레임이라고 한다. 토큰에는 여러개의 클레임을 담을 수 있다.

    {
    	"id" : "holimc",
        "password" : "비밀번호",
        "age" : 32
        "iat" : 2305902212
    }

    클레임의 종류는 3가지로

    registered claims : 미리 정의되어있는 클레임으로 발행자, 만료시간, 제목, 발행시간, id 등의 정의된 클레임이다.

    public claims : 사용자가 정의할 수 있는 공개된 클레임

    private claims : 해당되는 유저를 특정할 수 있는 비공개된 클레임

    이 있다.

     

    마지막으로 전자서명(signature)이 있다.

    헤더에서 정의된 알고리즘과 서버에서 판별하기 위한 비밀키값을 담고있는 부분이다.

     

    JWT의 장점으로는 인증에 대한 별다른 저장소를 필요하지 않음으로 서버에 부담이 적으며, 토큰을 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다 ( OAuth를 활용하는 소셜 로그인 등 )

    단점으로는 토큰 자체에 정보가 담겨있으며, 클라이언트에 저장되는 만큼 사용자의 상태나 정보를 데이터베이스를 통해 조작할 수가 없으며, 정보의 길이가 길어지면 토큰의 길이 역시 늘어나는 문제가 있다.

    '개발공부' 카테고리의 다른 글

    SPA (Single Page Application), MPA(Multiple Page Application)  (0) 2023.06.08
    AOP란?  (0) 2023.06.04
    SQL Injection이란?  (0) 2023.05.31
    의존성 주입(Dependency Injection)  (0) 2023.05.30
    안녕하세요  (0) 2023.05.30
Designed by Tistory.