
JWT (Jason Web Token)
로그인과 회원가입에 이용 되는 JWT 는 JSON Web Token의 약자로 전자 서명 된 URL-safe (URL로 이용할 수있는 문자 만 구성된)의 JSON입니다.
전자 서명은 JSON 의 변조를 체크 할 수 있게되어 있습니다.
JWT는 속성 정보 (Claim)를 JSON 데이터 구조로 표현한 토큰으로 RFC7519 표준 입니다.
JWT는 서버와 클라이언트 간 정보를 주고 받을 때 Http 리퀘스트 헤더에 JSON 토큰을 넣은 후 서버는 별도의 인증 과정없이 헤더에 포함되어 있는 JWT 정보를 통해 인증합니다.
이때 사용되는 JSON 데이터는 URL-Safe 하도록 URL에 포함할 수 있는 문자만으로 만듭니다.
JWT는 HMAC 알고리즘을 사용하여 비밀키 또는 RSA를 이용한 Public Key/ Private Key 쌍으로 서명할 수 있습니다.
jwt를 사용하는 서비스에서는 , 사용자가 로그인을 하면 토큰(인코딩처럼 암호화된 데이터)이라는 표를 세션과다르게 찢어서 주지않고 그냥준다 (서버가 뭔가를 기억하고 있지 않는다는것)
이토큰 암호는 마침표 (.) 으로 끊어져서 세 부분으로 나뉘는데 각각 header , payload , vertify signature로 구분됨
Ex) {header}.{payload}.{signature}
위인코드를 디코드 한값
그 중 먼저 payload에대해서 알아보자면 이걸 Base64로 디코딩해보면 JSON형식으로 여러 정보들이 들어있음
이 토큰을 누가 누구에게 발급했는지 , 이토큰이 언제까지 유효하고 서비스가 사용자에게 이 토큰을 통해 공개하기 원하는 내용 (사용자의 닉네임 서비스상의 레벨, 관리자여부등)처럼 서비스측에서 원하는대로 담을수있다 이렇게 토큰에 담긴 사용자 정보등의 데이터를 Claim이라고한다.
즉 사용자가 로그인을 하고나서 받는 토큰에 이정보들이 클레임이라는걸로 실려나온다는 거고
이게 이후 요청들마다 이번에는 사용자로부터 서버한테 보내지고 , 사용자가 받아서 갖고 있는 토큰 자체에 이런 정보들이 들어있으면은 서버가 요청마다 일일이 데이터베이스에서 찾아봐야할것들이 줄어든다
하지만 특별한 암호화도 아니고 Base64로 인코딩 돼있는거면 사용자가 자바스크립트로든 뭐로든 다시 디코딩해서 볼 수 있다는 거고
그러면은 사용자가 이거를 조작해서 악용할수도 있음
만약 조작해서 토큰의 유효기간을 50년으로 늘려준다거나 관리자 여부 같은게 토큰에 담겨있으면 이걸 true로 바꿔서 관리자 권한으로 인가를 받아버리는것을 방지하기 위해서 1번 header 와 3번 verify signature 파트가 있는거임
1번 header 부터 살펴보면 header는 디코딩을 해보면 type , 토큰의 타입 2가지 정보가 담겨져있고 여기에는 항상 JWT가 들어간다.
type이 JWT여야 JWT인거임 [고정값임] , 다른 하나는 alg(알고리즘의 약자)이게 중요하다 alg는 3번 서명값을 만드는데 사용될 알고리즘이 지정된다 (HS256등 여러 암호화 방식중 하나를 지정할수있다)
헤더와 페이로드 , 그리고 서버에 감춰놓은 비밀 값 셋을 이 암호화 알고리즘에 넣고 돌리면 3번 서명 값이 나옴
암호화 알고리즘은 한쪽방향으로는 계산이 되도 반대쪽으로는 안되서 서버만 알고있는 그 비밀 값을 찾아낼 방법이 없다는것임.
(토큰들 잔뜩 탈취해서 백날 들여다봐도 그리고 글자 하나만 바뀌어도 3번 값이 완전히 달라지는거라 2번페이로드를 수정해서 유효한 3번 서명값이 나오려면 서버에 숨긴 비밀키를 알고 있어야하기 떄문에 이걸 조작을 못하는거임)
즉 서버는 요청에 토큰값이 실려들어오면 1,2번의 값을 서버의 비밀 키 와 함께 돌려봐서 계산된 결과값이 3번 서명 값과 일치하는 결과가 나오는지 확인함 만약 2번 페이로드의 정보가 서버가 아닌 누군가에 의해 조금이라도 수정되었다면 당연히 안 맞는다.
(정보를 조작한 사용자이거나 해커로 간주되어 거부됨)
3번서명값과 계산값이 일치하고 , 유효기간도 지나지 않았다면 그 사용자는 로그인 된 회원으로서 인가를 받는것
(그럼 이제 서버는 사용자들의 성태를 어디다가 따로 기억을 해둘 필요가없이 , 이비밀값만 손에 쥐고 있으면 요청들 들어올때마다 토큰 확인해서 사용자들을 걸러낼수있음)
이처럼 시간에 따라 바뀌는 어떤 상태값을 안 갖는 걸 stateless하다고 한다. 세션은 반대로 stateful임
API(Application Programming Interface)
Interface
- 상호간의 소통을 위해 만들어진 접점 (키보드 ,리모컨 등등)
User Interface
- 사용자가 사용하는 인터페이스 (홈페이지 화면등등)
응용 프로그램에서 사용할 수있도록 , 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스
소프트웨어가 다른소프트웨어로부터 지정된 형식으로 요청 . 명령을 받을 수 있는 수단 (프로그램이 서로 소통하는 방법)
(코드들끼리 서로 소통하기위해 만들어진것)
서버에 정보를 달라고 하는것을 요청=request라고 하고 찾은정보를 내 사이트에 받는것은 응답=response라고 한다.
-네트워크에서 기기들간의 의사소통 해나가는 규격사항을 HTTP라고 부른다
라이브러리나 프레임워크에서 우리가이용할수있는 클래스나 함수들도 API라고 부름
내부의 구현사항을 잘숨겨두고 외부에서 사용하는 사람이 필요한것만 노출해 두고 이것을 인터페이스, API라고 부른다
API는 데이터서버를 갖고있는 사람들이 원하는대로 디자인 할수있음
1 요청 (request)
1. 주소 : "https://naver.com"
2.전송방식 : GET
3.보낼것 :
query 검색어 (필수)
sort 정렬방식 (선택)
target 검색대상 (선택)
2. 응답 (response)
1. 형식:JSON
2. 응답 의미 설명
title 도서제목
contents 도서소개
thumbnail 도서표지 썸네일 URL