본문 바로가기

프로그래밍/주간 일지 WIL

JWT와 API

이번 주에 개발 공부를 하며 제가 집중한 키워드는
JWTAPI입니다.
사실 JWT와 API는 이전 포스트에도 소개했었는데요,
복습하는 차원에서 다시 한번 작성해볼게요.



 

JWT

JWT(Json Web Token)은
인증에 필요한 정보들을 암호화시킨 토큰*을 말합니다.

* 토큰:
프로그래밍 언어에서 토큰이란,
문법적으로 더 이상 나눌 수 없는
기본적인 언어 요소를 말합니다.
예를 들어, 하나의 키워드나 연산자 또는
구두점 등이 토큰이 될 수 있습니다.

네트워크에서 말하는 토큰이란,
토큰링 네트워크를 따라 돌아다니는
일련의 특별한 비트열입니다.
컴퓨터들은 네트워크를 따라 순환하는 토큰을
자신이 잡았을 때만
네트워크에 메시지를 보낼 수 있습니다.
각 네트워크에는 토큰이 딱 하나만 있으므로
두 개 이상의 컴퓨터가 동시에
메시지를 전송할 가능성을 사전에 차단합니다.

JWT는 Header, Payload, Signature라는
세 가지 문자열의 조합으로 만들어지며,
각 문자열은 .을 구분자로 하여 나누어집니다.

Header는 정보를 암호화할 해싱 알고리즘 alg 및
토큰의 타입 typ를 지정합니다.

Payload는 토큰에 담을 정보를 지니고 있으며,
주로 클라이언트의 고유 ID 값 및 유효 기간이
포함됩니다.

Signature는 인코딩 된 Header와 Payload를 더한 뒤
비밀키로 해싱하여 생성합니다.

Header와 Payload는 단순히 인코딩 된 값이기 때문에
제삼자가 복호화 및 조작할 수 있지만,
Signature는 서버 측에서 관리하는 비밀키가
유출되지 않는 이상 복호화할 수 없습니다.
따라서 Signature는 토큰의 위변조 여부를
확인하는 데 사용됩니다.
즉, JWT는 Header와 Payload를 가지고
Signature를 생성하므로
데이터 위변조를 막을 수 있어 보안에 강합니다.



쿠키/세션 대비 JWT 인증 방식은 여러 장점이 있습니다.

1. 세션은 클라이언트 인증 정보를 저장하기 위해
서버에서 세션 저장소를 사용하지만,
JWT는 인증 정보에 대한 별도의 저장소가 필요하지 않아
서버를 무상태로 만듭니다.

2. 쿠키는 웹 브라우저마다
쿠키에 대한 지원 형태가 다르기 때문에
브라우저 간 공유가 불가능하지만,
JWT는 토큰 기반으로
다른 로그인 시스템에 접근 및 권한 공유가 가능합니다.
OAuth의 경우,
Facebook이나 Google 등 소셜 계정을 이용하여
다른 웹서비스에서도 로그인을 할 수 있습니다.

3. JWT는 토큰에 대한 기본 정보, 전달할 정보,
그리고 토큰이 검증됐음을 증명하는 서명 등
필요한 모든 정보를 자체적으로 지니고 있습니다.

4. 또한 확장성이 우수하고,
모바일 애플리케이션 환경에서도 잘 동작합니다.

 


 

API

API가 무엇인지는
웹페이지가 작동하는 방식을 통해
쉽게 알 수 있습니다.

먼저, 우리가 흔히 보는 웹페이지는
"클라이언트"라고 합니다.
영어로 client,
한국어로 고객 또는 의뢰인이라는 뜻이죠.
웹페이지는 서버의 고객으로서,
서버에 무언가를 의뢰합니다.
그 무언가란 바로
HTML, CSS, Javascript로 작성된 코드입니다.

즉, 웹페이지는 서버에 파일을 요청하여
파일의 내용대로 웹페이지를 그리는 일을 하는 것이죠.
정확히는 서버의 API에 요청을 보내는데,
API란 비유하자면 서버가 미리 만들어 놓은
"창구" 같은 것입니다.
예를 들어 https://naver.com/라는 웹페이지는
"naver.com"이라는 이름의 서버에 있는,
"/" 창구에 요청을 보낸 것입니다.





자, 이제 API가 무엇인지 대략 알았으니
보다 일반적인 의미의 API를 알아볼게요.
API란 Application Programming Interface
(응용 프로그램 프로그래밍 인터페이스)의 약자로,
컴퓨터나 컴퓨터 프로그램 사이를 연결하고,
다른 종류의 소프트웨어에 서비스를 제공하는
소프트웨어입니다.
무슨 말인지 잘 와닿지 않죠?

우리가 집을 지을 때,
나무를 베어서 통나무를 만들고
찰흙을 파내서 벽돌을 만드는 것부터
시작하지는 않습니다.
그 대신 문, 창문, 난로, 온수기, 배관 설비 같이
미리 만들어진 부품을 사서 조합합니다.

프로그래밍도 마찬가지입니다.
어떤 프로그램도 처음부터 완전히
새로 만들어지지는 않습니다.
프로그램은 다른 사람들이 이미 만들어 놓은
구성 요소를 이해하고,
자신만의 방식으로 이어 붙여 만들어지죠.
이때 함수를 이용하면
따로 만들어진 구성 요소를 필요에 따라
적절히 조합하여 프로그램을 만들 수 있습니다.

이렇게 연관된 함수들의 모음을 라이브러리라고 합니다.
함수 라이브러리가 제공하는 서비스는
API라는 인터페이스로 프로그래머에게 제공됩니다.
API는 포함하는 함수와 더불어
함수의 용도, 함수 사용법,
어떤 입력 데이터를 요구하는지,
어떤 값을 만들어 내는지 나열합니다.
또한 API는 시스템 내부에서 주고받는 데이터의 구조를
의미하는 자료 구조와 기타 세부 사항도 기술합니다.
이 모든 것이 모여
프로그래머가 서비스를 요청하기 위해 무엇을 해야 하고,
결과적으로 무엇이 계산될지 정의합니다.
API는 구문과 관련된 기본 명세*뿐 아니라
시스템을 효과적으로 사용하도록 돕는 지원 문서인
SDK(Software Development Kit,
소프트웨어 개발 키트)도 포함합니다.

* 명세: 프로그래밍의 유지 보수가 가능하도록
프로그램의 구조와 기능을 상세하게 기술한 문서.





정리해볼게요.

JWT(Json Web Token)
: 인증에 필요한 정보들을 암호화시킨 토큰

JWT = Header.Payload.Signature

Signature는 Header와 Payload를 통해 생성되고, 비밀키가 유출되지 않는 이상 복호화할 수 없으므로 토큰의 위변조 여부를 확인하는 데 사용됩니다.

따라서 JWT는 데이터 위변조를 막을 수 있어
보안에 강합니다.
함수들의 모음: 라이브러리API를 통해 제공

API에 포함된 내용
1. 함수, 함수의 용도, 함수 사용법
2. 필요한 입력 데이터, 출력 데이터
3. 자료 구조
4. SDK
5. 기타 세부 사항

참고 문헌: <1일 1 로그 100일 완성 IT 지식>

'프로그래밍 > 주간 일지 WIL' 카테고리의 다른 글

props, state, 리렌더링 발생 조건  (0) 2022.07.31
JavaScript의 ES란? ES5 vs. ES6  (0) 2022.07.24