1주차 마무리 개발일지

channn02·2022년 11월 20일
0

WIL

목록 보기
2/2

JWT(JSON Web Token)

JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미한다
그리고 JWT 기반 인증은 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식이다
JWT는 JSON 데이터를 Base64 URL-safe Encode를 통해 인코딩하여 직렬화한 것이며, 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 들어있다
따라서 사용자가 JWT 를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려준다

[출처] 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

JWT는 . 을 구분자로 나누어지는 세 가지 문자열의 조합이다
. 을 기준으로 좌측부터 Header, Payload, Signature를 의미한다

Header와 Payload는 단순히 인코딩된 값이기 때문에 제 3자가 복호화 및 조작할 수 있지만 Signature는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다
따라서 Signature는 토큰의 위변조 여부를 확인하는데 사용된다

직접 JWT 토큰을 생성해 연습해보고 싶다면 JWT공식사이트에서 쉽게 JWT 토큰을 인코딩(생성) 하거나 디코딩 할수 있다

  • JWT 인증 과정
  1. 사용자가 ID, PW를 입력하여 서버에 로그인 인증을 요청한다.
  2. 서버에서 클라이언트로부터 인증 요청을 받으면, Header, PayLoad, Signature를 정의한다.
    Hedaer, PayLoad, Signature를 각각 Base64로 한 번 더 암호화하여 JWT를 생성하고 이를 쿠키에 담아 클라이언트에게 발급한다.
  3. 클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장한다. (쿠키나 다른 곳에 저장할 수도 있음)
    API를 서버에 요청할때 Authorization header에 Access Token을 담아서 보낸다.
  4. 서버가 할 일은 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인하여 일치한다면 인증을 통과시켜주고 아니라면 통과시키지 않으면 된다.
    인증이 통과되었으므로 페이로드에 들어있는 유저의 정보들을 select해서 클라이언트에 돌려준다.
  5. 클라이언트가 서버에 요청을 했는데, 만일 액세스 토큰의 시간이 만료되면 클라이언트는 리프래시 토큰을 이용해서
  6. 서버로부터 새로운 엑세스 토큰을 발급 받는다.
  • JWT 토큰 인증 신뢰성을 가지는 이유

유저 JWT: A(Header) + B(Payload) + C(Signature) 일 때 (만일 임의의 유저가 B를 수정했다고 하면 B'로 표시한다.)

  1. 다른 유저가 B를 임의로 수정 -> 유저 JWT: A + B' + C
  2. 수정한 토큰을 서버에 요청을 보내면 서버는 유효성 검사 시행
    ㅇ 유저 JWT: A + B' + C
    ㅇ 서버에서 검증 후 생성한 JWT: A + B' + C' => (signature) 불일치
  3. 대조 결과가 일치하지 않아 유저의 정보가 임의로 조작되었음을 알 수 있다
    서버는 토큰 안에 들어있는 정보가 무엇인지 아는게 중요한 것이 아니라 해당 토큰이 유효한 토큰인지 확인하는 것이 중요하기 때문에 클라이언트로부터 받은 JWT의 헤더, 페이로드를 서버의 key값을 이용해 시그니처를 다시 만들고 이를 비교하며 일치했을 경우 인증을 통과시킨다

JWT은 서명(인증)이 목적이다
JWT는 Base64로 암호화를 하기 때문에 디버거를 사용해서 인코딩된 JWT를 1초만에 복호화할 수 있다
복호화 하면 사용자의 데이터를 담은 Payload 부분이 그대로 노출되어 버린다. 그래서 페이로드에는 비밀번호와 같은 민감한 정보는 넣지 말아야 한다
그럼 토큰 인증 방식 자체가 빛 좋은 개살구라고 생각할수도 있지만 토큰의 진짜 목적은 정보 보호가 아닌 위조 방지이다
바로 위에서 소개했듯이 시그니처에 사용된 비밀키가 노출되지 않는이상 데이터를 위조해도 시그니처 부분에서 바로 걸러지기 때문이다

  • JWT 장점
    : Header와 Payload를 가지고 Signature를 생성하므로 데이터 위변조를 막을 수 있다
    : 인증 정보에 대한 별도의 저장소가 필요없다
    : JWT는 토큰에 대한 기본 정보와 전달할 정보 및 토큰이 검증됬음을 증명하는 서명 등 필요한 모든 정보를 자체적으로 지니고 있다
    : 클라이언트 인증 정보를 저장하는 세션과 다르게, 서버는 무상태(StateLess)가 되어 서버 확장성이 우수해질 수 있다
    : 토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다 (쿠키와 차이)
    : OAuth의 경우 Facebook, Google 등 소셜 계정을 이용하여 다른 웹서비스에서도 로그인을 할 수 있다
    : 모바일 어플리케이션 환경에서도 잘 동작한다 (모바일은 세션 사용 불가능)

  • JWT 단점
    : Self-contained : 토큰 자체에 정보를 담고 있으므로 양날의 검이 될 수 있다
    : 토큰 길이 : 토큰의 Payload에 3종류의 클레임을 저장하기 때문에, 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다
    : Payload 인코딩 : payload 자체는 암호화 된 것이 아니라 BASE64로 인코딩 된 것이기 때문에 중간에 Payload를 탈취하여 디코딩하면 데이터를 볼 수 있으므로, payload에 중요 데이터를 넣지 않아야 한다
    : Store Token : stateless 특징을 가지기 때문에 토큰은 클라이언트 측에서 관리하고 저장한다 때문에 토큰 자체를 탈취당하면 대처하기가 어렵게 된다

API

API는 관련 없는 두 애플리케이션이 서로 통신할 수 있도록 하는 소프트웨어 중개자이다 한 프로그램에서 요청이나 메시지를 받은 다음 다른 프로그램으로 전달하고 API가 수행하도록 프로그래밍된 작업을 기반으로 메시지를 번역하고 프로토콜을 수행하는 브리지 역할을 한다 API는 플러그인, 디지털 인터페이스 및 소프트웨어 통신과 같은 현대 세계에 숨겨진 백본인 디지털 생활의 거의 모든 측면에 존재한다 API는 모든 것을 함께 연결하고 소프트웨어 시스템이 조화롭게 작동하도록 한다

API는 대부분 비즈니스 사용자에게는 보이지 않지만 소프트웨어 프로그램에 대한 다양한 가능성을 열어준다
API는 통제된 방식으로 소프트웨어의 기능과 데이터의 작은 부분을 열어 작동한다 이를 통해 개발자는 전체 시스템의 코드에 액세스할 필요 없이 해당 프로그램, 하드웨어, 데이터 또는 앱에 액세스할 수 있다

API는 다양한 루틴, 도구 및 프로토콜을 사용하여 서로 다른 소프트웨어 구성 요소가 함께 작동하는 방식을 지정한다 API에는 비공개 및 공개의 두 가지 유형이 있다
: 공개 API는 소비자 대면 애플리케이션과 함께 작동하며 기업에 다양한 앱, 모바일 장치 및 브라우저를 사용하여 고객과 연결할 수 있는 기회를 제공한다
: 비공개 API는 백엔드에서 작동하여 고객, 직원 및 기타 이해 관계자에게 더 나은 서비스를 제공할 수 있도록 운영을 간소화하고 도구를 만든다

  • API는 비즈니스에서 언제 사용?

API는 서로 다른 두 시스템이 서로 액세스해야 하거나 외부 소프트웨어를 기존 시스템에 결합해야 하는 경우와 같이 소프트웨어 개발 시나리오의 모든 시점에서 사용할 수 있다 API는 최신 소프트웨어를 혼합하여 사용하는 모든 조직에 필수적인 도구이다

예를 들어 회사 웹사이트는 API를 사용하여 회사 소개 페이지에 포함된 Google 맵과 Google 맵 자체를 연결한다 한 회사는 독자들이 가장 가까운 지점 위치를 찾을 수 있도록 웹사이트에 Google 맵을 삽입한다
이는 Google의 공개 API를 사용하는 회사에서 수행한다

회사 사이트의 API는 기본적으로 Google 맵에서 API를 호출하여 정보와 기능을 제공한다 물론 이것은 상호 작용의 측면에 좋다 회사 웹사이트는 기능을 향상시켰고 Google 맵은 수수료를 통해 이러한 유형의 데이터 공유를 수익화하거나 맵에 브랜드를 지정하여 마케팅 활동을 강화할 수 있다

보다 큰 의미에서 API는 일부 비즈니스의 성장과 확장을 가능하게 했다 이것은 기업이 결제, 통신, 데이터 통합 또는 기타 수많은 작업을 위해 자체 소프트웨어를 개발하는 대신 API는 외부 타사 소프트웨어가 내부 시스템 내에서 완벽하게 작동한다는 것을 의미한다

  • API를 사용하는 이유?

API를 통해 조직은 자체 소프트웨어 및 데이터 사용을 소유하지 않는 애플리케이션과 데이터로 확장할 수 있다
이를 통해 기능 향상, 비용 절감, 기술 혁신, 그리고 다음과 같은 운영 간소화 등의 다양한 이점을 누릴 수 있다

  1. 고객을 위한 향상된 기능
    ㄴ 기업은 완전히 새로운 데이터 세트와 기능에 액세스할 수 있기 때문에 고객에게 향상된 고객 경험을 제공할 수 있다
    ㄴ 예를 들어 웹사이트에 Google 맵을 삽입하면 사용자가 다른 웹사이트나 애플리케이션을 클릭하지 않아도 되므로 시간이 절약되고 반복 고객이 될 가능성이 높아진다
  2. 비용 절감
    ㄴ 기업은 맞춤형 소프트웨어를 만들기 위해 값비싼 개발자를 고용하는 대신 API를 사용하여 앱과 프로그램 전반을 원활하게 통합할 수 있다 회사는 자체로 개발하는 대신 기존 소프트웨어를 활용하여 연구 개발 비용을 절약할 수 있다
  3. 시간 절약
    ㄴ API는 일반적으로 이미 작성되었으며 각 엔드와의 통합만 필요하므로 소프트웨어 개발에는 지연이 없다
  4. 더 나은 커뮤니케이션
    ㄴ 비즈니스에 새로운 소프트웨어가 추가되면 API가 모든 것을 통합하여 정보 흐름이 원활하게 이루어진다
  5. 원활한 연결
    ㄴ 이제 거의 모든 스마트 기기 또는 애플리케이션이 인터넷에 연결된다 API를 사용하면 이러한 스마트 장치를 연결하여 쉽게 인쇄하거나 직장에서 커피를 주문할 수 있다
  6. 마케팅 범위 확장
    ㄴ Facebook, Twitter, Instagram, Pinterest 및 기타 소셜 미디어 플랫폼의 API를 사용하면 버튼 클릭으로 블로그, 정보 또는 제안을 쉽게 공유할 수 있다
  7. 혁신 장려
    ㄴ API가 제공하는 보안 및 기능을 통해 개발자는 우점을 미처 상상할 수 없을 것이다
  8. 운영 간소화
    ㄴ 예를 들어 비즈니스에서 여행 앱을 개발하는 경우 API를 사용하면 고객이 인터페이스를 벗어나거나 다른 곳에서 로그인하지 않고도 비행기에서 차량 공유, 호텔로 이동할 수 있다 API를 사용하여 기업은 예약, 결제 및 이행 구성 요소를 함께 연결할 수 있다
  9. 더 빠른 혁신
    ㄴ 변화 장벽이 더 작아져 더 빠르게 혁신한다 기성 API는 개발자 시간이 단축되고 결과가 빨라진다 개발자는 새로운 소프트웨어나 프로그램에 빠르고 쉽게 적응할 수 있다

: 많은 API는 무료로 소프트웨어를 제공하는 회사 또는 개발자와 함께 제공된다 이는 일반적으로 프로그램을 사용하면 소프트웨어의 범위와 시장 진출이 확대되어 더 많은 사용자가 생성되기 때문이다

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

Pre-Onboarding주차를 끝내고 1주차에 미니프로젝트를 진행했다
그리고 이제 2주차 알고리즘 주차다...
너무 어렵고 어떻게 접근해야할 지 아직도 잘 모르겠다
해답을 보면 왜 그걸 쓰는지 문법은 이해가 간다
근데 내가 그걸 활용해서 쓰질 못하겠다
머릿속에 이론이 있으면 뭐하나 꺼내 쓰질 못하는데?

일단 방법을 더 연구해야 할 것 같다
아직 목요일까지 시간이 있으니 내일부터 더 집중해봐야겠다
종이 꺼내놓고 그림 그려보고 하는데 활용하는 방법을 좀 터득해봐야겠다
이것저것 아직 덜 만들어봐서 그런가
일단 더 해봐야겠다...

profile
드디어 신발 신은 프론트엔드 개발자

0개의 댓글