항해99

항해99 WIL.1 JWT와 API

밍튜 2022. 7. 17. 21:57

첫 항해를 시작하고 이번주에 배운 점

-java의 기본문법... 반복문 조건문 기본 코딩치는 방법등....

 

 

느낀 점

-아직 게임 시작도못하고 튜토리얼에서 헤매는 느낌이다

자꾸 스킬쓸려고 뭐누르지 보면 까먹고 이건 뭐랑 뭐눌러야되지 하면 까먹고...

자꾸 제자리ㅠㅠㅠㅠㅠㅠㅠㅠ

-미리 예습을 좀 할걸그랬다 너무너무 후회된다 하지만 이미늦은거 어쩔수없지

잠을 줄여서라도 빨리 따라가야겠다

나도 사냥하고싶다...ㅠㅠ

 

 

JWT와 API에 대해 알아보기 전에 먼저 '인증'(Authentication)과 '인가'(Authorization)의 차이에 대해 알아야겠다

  • Authentication(인증)

말그대로 ID와 PW를 서버에 주고 로그인하여 사용자가 특정 서비스에 접근할수있도록 인증을 받는것 

  • Authoriztion(인가)

사용자가 한번 인증(로그인)을 받은 후에 사용자가 같은 웹사이트의 다른 페이지를 돌아다녀도

계속 로그인 상태로 돌아다닐수 있게할지 결정하는 프로세스이다  어서와~~ 어서리제이션이니까 로그인을하면 서버가 어서와~~~

 


아니 돌아다닐때마다 로그인하면 되지 왜 인가를 해줘야하지??

1)로그인은 꽤 무거운 작업이라 작업이 복잡하다

2)매번 db에 아이디와 비번이 왔다갔다하면 보안상 취약해진다


Session

전통적으로 많이 사용되는 방식으로 '서버 기반 인증 방법'이다

세션 id를 사용해서 어떤 유저가 서버에 로그인 되어있음이 지속되는 상태를 'Session'이라고 한다

 

사용자가 아이디와 비번을 서버로 보내면 서버는 확인해서 세션DB에  'id '라는 유저DB를 생성한다

해당 세션에는 별도의 ID가있다 

해당 세션 ID는 쿠키를 통해 브라우저로 돌아오고 저장됨!

브라우저는 그렇게 받은 쿠키를 같은 웹사이트의 다른페이지를 돌아다니는 동안 서버에게 보낸다 

쿠키는 서버로 자동으로 보내지는데 세션ID와 함께 오는 쿠키를 확인한다 

중요한 user db는 모두 서버에 있게된다. 유저가 갖고있는것은 오직 세션id뿐. 쿠키는 이 세션id를 전달해주는

매개체이다

 

어떻게 Authentication할까?

1)유저가 로그인 하면 세션을 발행한다 ( 티켓을 줌)

2) 그 세션을 브라우저에도 저장하고 서버 메모리에도 저장한다 ( 티켓을 잘라서 브라우저랑 서버로 나눠가짐)

3) 인가가 필요한 요청을 보낼때 서버에서 세션값을 같이 보냄

4) 서버는 메모리에 저장된 값과 세션값을 비교해서 맞는 값이 있으면 authorization 어서와~  (티켓이 그 잘랐던 티켓인지 확인)

 

그럼 단점은??

1)사용자가 많아지면 메모리 부담이 커짐

2)서버가 재부팅되어야하면 저장된 세션이 다달라가고, 모든 사용자가 로그인이 튕겨 다시 로그인해야됨

3)서버가 분산되어있으면 세션 유지가 제대로 안되기때문에 서버 확장이 어려움(가능은한데 복잡함)

 

 

 


Token

쿠키는 브라우저에만 있고 ios나 안드로이드에는 없다... 그럼 어떻게하지?

이때 사용되는것이 토큰이다.

토큰은 이상하게 생긴 String이라고 이해하면 편하다

'토큰 = 서버가 기억하는 이상하게 생긴 텍스트. id 카드처럼 서버에게 보여줘야 되는것'

유저는 토큰을 서버로 보내고, 서버는 세션DB에서 토큰과 맞는 유저db를 찾는다

 

 

JWT (Json Web Token)

jwt = 정보를 갖고 있는 토큰. db없이 검증할수 있음

사용자가 로그인 하면 서버는 토큰을 주는데, 이번에는 찢어서 나눠갖지않고 사용자에게만 준다

이 토큰은 서버가 기억하고있지 않다는 얘기다

암호화된 3가지 데이터를 이어붙인 형태(aaa.bbb.ccc)로 구성되어 있다.


aaa. 헤더: 알고리즘(3번 서명 값을 만드는데 사용될 알고리즘이 지정 ex) HS256), type이 들어감 (요기는 언제나 JWT 타입이 들어감)
bbb. 페이로드: 토큰이 갖는 데이터(누가 누구에게 발급했는지, 토큰 유효기간, 서비스공개한도(Claim)
ccc. 서명 (signature): 1번 헤더에 정의된 알고리즘을 통해 암호화한 비밀 값으로 서버만 알고 있음

 

1번헤더와 2번 페이로드 그리고 '서버에 감춰놓은 비밀값'을 암호화 알고리즘에 넣고 돌리면 3번 서명값이 나온다

암호화 알고리즘은 한쪽 방향으로는 계산이 되어도 반대쪽으로는 안되서 

즉 서버는 자기 비밀값과 토큰의 1번헤더 2번페이로드 값을  같이 돌려봐서 계산된 결과값이 3번 서명이 나오는지 확인한다 

 

JWT는 세션처럼 모든 사용자들의 상태를 기억하고있지않다(예를들면 넷플릭스의 다중접속이나 인스타그램의 사용자 로그인 위치나 로그인기기 추적등은 세션을 사용)

세션을 이용한경우는 한 기기에서만 로그인 가능한 서비스를 만들고 싶을때 사용.

JWT는 이미 줘버린 토큰을 뺏을수도 없음. 해커에게 토큰을 빼앗겨도 토큰을 무효화할 방법이 없다.

 

이를 해결하기위해 로그인시에 Access Token과 refreshToken을 준다

액세스토큰은 매번 인가 받을때 사용하는 토큰( 수명이 짧다)

리프레쉬토큰은 액세스 토큰의 수명이 다했을때 액세스토큰을 재발행 받기 위한 토큰(보통 수명이 2주로 길다). 보통 db에 저장해놓는다

 

 


즉 서버는 유저 인증을 하기 위해서 JWT를 쓸수도 있고 Session을 쓸수도 있다.

쿠키 

:서버가 클라이언트의 브라우저에 데이터를 넣을수있는데 이게 바로 쿠키

쿠키의 유효기간이 있음

쿠키는 인증 뿐아니라 여러가지 정보를 저장

쿠키 = 그냥 옮기는 시스템 ,매개체

 

Stateless

:서버로가는 모든 요청이 이전 리퀘스트와 독립적으로 작용하는것

요청이끝나면 서버는 우리가 누군지 잊어버림

그래서 요청할때마다 우리가 누군지 알려줘야하는데 

이를 하는 방법중 하나가 바로 세션 (Session)

jwt는 반대로 Stateful


Api

:하나의 프로그램에서 다른 프로그램으로 데이터를 주고 받기 위한 방법

 

예를들면 식당의 메뉴판이라고 생각하자

 

우리가 주문을할때 메뉴판을 보고 주문하듯이

1번 메뉴 . 2번 메뉴. 3번 메뉴가 적힌 메뉴판이 식당의 API (식당과 손님이 음식을 주고받기위한 방법)

 

웹툰 서비스를 보내주는 프로그램이라고 보면

API메뉴판을 만들어 1.신과함께 2.이말년 3.헬퍼가 적힌 메뉴판으로 웹툰서버와 손님이 웹툰을 주고받기위한 방법이다

여기서 방법은 코드다

 

API가 가져야할 내용

(GET 요청)comic.naver.com/webtoon/detail?id=23223

      1       /          2                                                /       3

1.요청방식이 들어가야됨(method) 데이터를 달라고 할건지 보낼건지

2.무슨 자료를 요청할지 (endpoint) 어떤 데이터를 요청할거야?? 웹툰? 뉴스?

3.파라미터. 자료요청에 필요한 추가정보. 내아이디 내정보

 

우리 유저도 사실 매번 코드를 짜면ㅅ 매번 API요청하고 있다

어떻게 ??? 브라우저를통해 주소창에 주소를 넣어 요청하는것처럼

코드 =주소 주소창에 API요청 코드를 넣고 GET요청을 하는것이다

 

api의 종류

  • public API : 누구나 사용가능한 공개 API
  • private API : 사내에서 몰래쓰는 API
  • partner API : 미리정해둔 사람만 쓰는 API