개발지식

JWT 란?!

우루쾅 2024. 3. 9. 23:22
728x90
반응형
SMALL

JWT 란?!

출처: https://inpa.tistory.com/entry/WEB-📚-JWTjson-web-token-란-💯-정리 [Inpa Dev 👨‍💻:티스토리]

 

JWT 는 Json Web Token의 약자로 인증에 필요한 정보들을 암호화 시킨 JSON 토큰을 의미합니다. 일반적으로 클라이언트와 서버 사이에서 통신할 때 권한을 위해 사용하는 토큰이며, 웹 상에서 정보를 Json 형태로 주고 받기 위해 표준규약에 따라 생성한 암호화된 토큰으로 복잡하고 읽을 수 없는 String 형태로 저장되어 있습니다.

 

JWT는 JSON 데이터를 Base64 URL-safe Encode 를 통해 인코딩하여 직렬화한 것이며, 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 들어있습니다. 따라서 사용자가 JWT 를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려줍니다.

 

 

Cookie 인증 VS Session 인증 VS Token 인증

  Cookie 인증 Session 인증 Token 인증
특징 웹 브라우저에 쿠키를 저장하여 인증 정보를 유지합니다. 서버에 세션 정보를 저장하고 세션 ID를 클라이언트에게 전달합니다. 클라이언트에게 발급된 토큰을 사용하여 인증을 처리합니다.
장점 간단하고 사용하기 쉽습니다. 서버에 상태를 유지하므로 보안이 좋습니다. 클라이언트와 서버의 상태를 분리하여 확장성이 용이합니다.
단점 쿠키가 탈취될 경우 보안에 취약합니다. 서버에 부하가 발생할 수 있습니다. 토큰의 유효 기간을 관리해야 하며, 탈취될 경우 보안에 취약합니다.
적합한 사용 사례 간단한 웹 애플리케이션에서 사용될 수 있습니다. 중요한 정보를 다루는 웹 애플리케이션에 적합합니다. RESTful API와 같은 서비스에 적합합니다.

 

쿠키(Cookie)는 Key-Value 형식의 문자열 덩어리 입니다.

클라이언트가 어떠한 웹사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버를 통해 클라이언트의 브라우저에 설치되는 작은 기록 정보 파일입니다. 각 사용자마다 브라우저에 정보를 저장하니 고유 정보 식별이 가능합니다.

 

세션(Session)은 보안적인 이슈로 클라이언트의 개인 정보를 브라우저가 아닌 서버측에서 관리하고 저장합니다. 서버의 메모리에 저장하기도 하고, 서버의 로컬 파일이나 데이터베이스에 저장하기도 합니다.

 

토큰(Token)은 클라이언트가 서버에 접속을 하면 서버에서 해당 클라이언트에게 인증되었다는 의미로 '토큰'을 부여합니다. 이 토큰은 유일하며 토큰을 발급받은 클라이언트는 또 다시 서버에 요청을 보낼 때 요청 해더에 토큰을 심어 보냅니다. 그러면 서버에서는 클라이언트로부터 받은 토큰을 서버에서 제공한 토큰과의 일치 여부를 체크하여 인증 과정을 처리하게 됩니다.

 

JWT와 Token의 차이점

  JWT(Json Web Token) 토큰(Token)
정의 JSON 형식으로 인코딩된 정보를 포함하는 액세스 토큰의 한 형식 보통 인증된 사용자를 나타내는 식별자
포함 내용 클레임(claim) 정보와 헤더, 페이로드, 서명 등을 포함 주로 사용자 ID 또는 인증에 필요한 정보 등
사용 용도 주로 인증 및 권한 부여를 위해 사용됨 주로 인증된 사용자를 식별하기 위해 사용됨
구조 헤더, 페이로드 및 서명으로 구성 문자열 또는 바이너리 형태로 구성됨
안전성 표준화된 형식으로 정보가 안전하게 전달됨 일반적인 토큰은 보안에 취약할 수 있음
표준화 RFC 7519에 정의되어 있음 보통 토큰의 형식은 표준화되어 있지 않음

 

기존 Token 인증

출처: https://inpa.tistory.com/entry/WEB-📚-JWTjson-web-token-란-💯-정리 [Inpa Dev 👨‍💻:티스토리]

 

① 사용자가 아이디와 비밀번호로 로그인을 합니다.

② 서버 측에서 사용자(클라이언트)에게 유일한 토큰을 발급합니다.

③ 클라이언트는 서버 측에서 전달받은 토큰을 쿠키나 스토리지에 저장해 두고, 서버에 요청을 할 때마다 해당 토큰을 HTTP 요청 헤더에 포함시켜 전달합니다.

④ 서버는 전달받은 토큰을 검증하고 요청에 응답합니다. 토큰에는 요청한 사람의 정보가 담겨있기때문에 DB를 조회하지 않고 누가 요청하는지 알 수 있습니다.

 

JWT 의 구성

JWT는 .을 구분자로 나누어지는 세 가지 문자열의 조합입니다.

. 을 기준으로 좌측부터 Header, Payload, Signature를 의미합니다.

 

Header 에는 JWT 에서 사용할 타입과 해시 알고리즘의 종류가 담겨있으며, Payload 는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있습니다. 마지막으로 Signature 에는 Header, Payload 를 Base64 URL-safe Encode 를 한 이후 Header 에 명시된 해시함수를 적용하고, 개인키(Private Key)로 서명한 전자서명이 담겨있습니다.

 

 JWT 인증 과정

출처: https://inpa.tistory.com/entry/WEB-📚-JWTjson-web-token-란-💯-정리 [Inpa Dev 👨‍💻:티스토리]

 

사용자가 ID, PW를 입력하여 서버에 로그인 인증을 요청합니다.

② 서버에서 클라이언트로부터 인증 요청을 받으면, Header, PayLoad, Signature를 정의합니다. Header, PayLoad, Signature 를 각각 Base64로 한번 더 암호화하여 JWT를 생성하고 이를 쿠키에 담아 클라이언트에게 발급합니다.

③ 클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장합니다.(쿠키나 다른 곳에 저장 가능) API를 서버에 요청할 때 Authorization Header에 Access Token을 담아서 보냅니다.

④ 서버가 할 일은 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인하여 일치한다면 통과시켜주고 아니라면 통과시키지 않으면 됩니다.

인증이 통과되었으면 페이로드에 들어있는 유저의 정보들을 SELECT 해서 클라이언트에 돌려줍니다.

⑤ 클라이언트가 서버에 요청을 했는데, 만일 액세스 토큰의 시간이 만료되면 클라이언트는 리프래시 토큰을 이용합니다. 

⑥ 리프래시 토큰 요청이 오면 액세스 토큰을 재발급 해줍니다.

 

JWT 문제점

① alg : none 공격

가끔 어떤 서버들은 alg 값을 none으로 셋팅했을 때 서버에 입장을 시켜줍니다. 하지만 최신 라이브러리를 사용하면 문제되지 않습니다.

② JWT 는 변환이 쉬움

암호화된 String 형태의 데이터는 복호화가 쉬워 데이터가 유출되면 정보를 쉽게 확인할 수 있습니다.

③ 시크릿키 문제

시크릿키를 대충 작성하면 때려맞추기 쉬워 시크릿키가 유출되면 서버에 아무나 들어올 수 있게 됩니다.

생성용키/검증용키 2개를 사용하는 방법으로도 방지할 수 있습니다.

④ JWT 탈취

이용자가 JWT 를 탈취당했을 때 해당 JWT를 정지하거나 막을 수 없습니다.

위 방식을 방지하기위해 훔치기 어렵게 만들기, JWT 블랙리스트 설정(session 방식과 유사함), jwt 유효기간을 짧게 셋팅하는 등의 방법이 있습니다.

 

 

 

 

 

 

 

출처

Inpa Dev - https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC

코딩애플 - https://www.youtube.com/watch?v=XXseiON9CV0

한서연 - https://velog.io/@hahan/JWT%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

728x90
반응형
LIST

'개발지식' 카테고리의 다른 글

RabbitMQ란?!  (2) 2024.03.11
프라이빗 VS 퍼블릭 클라우드  (2) 2024.03.10
OCI 란 무엇인가?!  (4) 2024.03.07
레디스(Redis)란 무엇인가?!  (4) 2024.03.04
프로토콜(Protocol)이란 무엇인가?  (0) 2024.03.02