1. REST API의 탄생

REST는 Representational State Transfer라는 용어의 약자로서 2000년도에 로이 필딩 (Roy Fielding)의 박사학위 논문에서 최초로 소개되었습니다. 로이 필딩은 HTTP의 주요 저자 중 한 사람으로 그 당시 웹(HTTP) 설계의 우수성에 비해 제대로 사용되어지지 못하는 모습에 안타까워하며 웹의 장점을 최대한 활용할 수 있는 아키텍처로써 REST를 발표했다고 합니다.

 

2. REST 구성

쉽게 말해 REST API는 다음의 구성으로 이루어져있습니다. 자세한 내용은 밑에서 설명하도록 하겠습니다.

  • 자원(RESOURCE) - URI
  • 행위(Verb) - HTTP METHOD
  • 표현(Representations)

 

3. REST 의 특징

1) Uniform (유니폼 인터페이스)

Uniform Interface는 URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일을 말합니다.

 

2) Stateless (무상태성)

REST는 무상태성 성격을 갖습니다. 다시 말해 작업을 위한 상태정보를 따로 저장하고 관리하지 않습니다. 세션 정보나 쿠키정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단순히 처리하면 됩니다. 때문에 서비스의 자유도가 높아지고 서버에서 불필요한 정보를 관리하지 않음으로써 구현이 단순해집니다.

 

3) Cacheable (캐시 가능)

REST의 가장 큰 특징 중 하나는 HTTP라는 기존 웹표준을 그대로 사용하기 때문에, 웹에서 사용하는 기존 인프라를 그대로 활용이 가능합니다. 따라서 HTTP가 가진 캐싱 기능이 적용 가능합니다. HTTP 프로토콜 표준에서 사용하는 Last-Modified태그나 E-Tag를 이용하면 캐싱 구현이 가능합니다.

 

4) Self-descriptiveness (자체 표현 구조)

REST의 또 다른 큰 특징 중 하나는 REST API 메시지만 보고도 이를 쉽게 이해 할 수 있는 자체 표현 구조로 되어 있다는 것입니다.

 

5) Client - Server 구조

REST 서버는 API 제공, 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보)등을 직접 관리하는 구조로 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로간 의존성이 줄어들게 됩니다.

 

6) 계층형 구조

REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 합니다.

 

 

4. REST API 중심 규칙

REST에서 가장 중요하며 기본적인 규칙은 아래 두 가지입니다.

  • URI는 정보의 자원을 표현해야 한다.
  • 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)으로 표현한다.

 

1번 사용자에 대해 정보를 받아야 할 때를 예를 들면, 아래와 같은 방법은 좋지 않습니다.

GET /users/show/1

 

이와 같은 URI 방식은 REST를 제대로 적용하지 않은 구 버전의 Rails에서 흔히 볼 수 있는 URL입니다. 이 URI은 자원을 표현해야 하는 URI에 /show/ 같은 불필요한 표현이 들어가 있기 때문에 적절하지 않습니다. 본다는 것은 GET이라는 HTTP Method로 충분히 표현할 수 있기 때문이죠. 최근의 Rails는 아래와 같이 변경되었습니다.

GET /users/1

 

자원은 크게 Collection과 Element로 나누어 표현할 수 있으며, 아래 테이블에 기초한다면 서버 대부분과의 통신 행태를 표현할 수 있습니다.

 

Resource GET PUT POST DELETE
Collection URI,
such as 
http://example.com/resources/
컬렉션에 속한 자원들의 RI나 그 상세사항의 목록을 보여준다. 전체 컬렉션은 다른 컬렉션으로 교체한다. 해당 컬렉션에 속하는 새로운 자원을 생성한다. 자원의 URI는 시스템에 의해 할당된다. 전체 컬렉션을 삭제한다.
Element URI,
such as 
http://example.com/resources/item17
요청한 컬렉션 내 자원을 반환한다. 해당 자원을 수정한다. 해당 자원에 귀속되는 새로운 자원을 생성한다. 해당 컬렉션내 자원을 삭제한다.
  • 이 외에도 PATCH 라는 HTTP Method에도 주목하시기 바랍니다. PUT이 해당 자원의 전체를 교체하는 의미를 지니는 대신, PATCH는 일부를 변경한다는 의미를 지니기 때문에 최근 update 이벤트에서 PUT보다 더 의미적으로 적합하다고 평가받고 있습니다. Rails도 4.0부터 PATCH가 update 이벤트의 기본 Method로 사용될 것이라 예고하고 있습니다.

 

4-1. REST API 중심 규칙

1) URI는 정보의 자원을 표현해야 한다. (리소스명은 동사보다는 명사를 사용)

    GET /members/delete/1

위와 같은 방식은 REST를 제대로 적용하지 않은 URI입니다. URI는 자원을 표현하는데 중점을 두어야 합니다. delete와 같은 행위에 대한 표현이 들어가서는 안됩니다.

 

2) 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)로 표현

위의 잘못 된 URI를 HTTP Method를 통해 수정해 보면

    DELETE /members/1

으로 수정할 수 있겠습니다.
회원정보를 가져올 때는 GET, 회원 추가 시의 행위를 표현하고자 할 때는 POST METHOD를 사용하여 표현합니다.

회원정보를 가져오는 URI

    GET /members/show/1     (x)
    GET /members/1          (o)

회원을 추가할 때

    GET /members/insert/2 (x)  - GET 메서드는 리소스 생성에 맞지 않습니다.
    POST /members/2       (o)

 

POST, GET, PUT, DELETE 이 4가지의 Method를 가지고 CRUD를 할 수 있습니다.

 

METHOD역할

 

POST POST를 통해 해당 URI를 요청하면 리소스를 생성합니다.
GET GET를 통해 해당 리소스를 조회합니다. 리소스를 조회하고 해당 도큐먼트에 대한 자세한 정보를 가져온다.
PUT PUT를 통해 해당 리소스를 수정합니다.
DELETE DELETE를 통해 리소스를 삭제합니다.

 

다음과 같은 식으로 URI는 자원을 표현하는 데에 집중하고 행위에 대한 정의는 HTTP METHOD를 통해 하는 것이 REST한 API를 설계하는 중심 규칙입니다.

 

4-2. URI 설계 시 주의할 점

1) 슬래시 구분자(/)는 계층 관계를 나타내는 데 사용

    http://restapi.example.com/houses/apartments
    http://restapi.example.com/animals/mammals/whales

 

2) URI 마지막 문자로 슬래시(/)를 포함하지 않는다.

URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것이고, 역으로 리소스가 다르면 URI도 달라져야 합니다. REST API는 분명한 URI를 만들어 통신을 해야 하기 때문에 혼동을 주지 않도록 URI 경로의 마지막에는 슬래시(/)를 사용하지 않습니다.

    http://restapi.example.com/houses/apartments/ (X)
    http://restapi.example.com/houses/apartments  (0)

 

3) 하이픈(-)은 URI 가독성을 높이는데 사용

URI를 쉽게 읽고 해석하기 위해, 불가피하게 긴 URI경로를 사용하게 된다면 하이픈을 사용해 가독성을 높일 수 있습니다.

 

4) 밑줄(_)은 URI에 사용하지 않는다.

글꼴에 따라 다르긴 하지만 밑줄은 보기 어렵거나 밑줄 때문에 문자가 가려지기도 합니다. 이런 문제를 피하기 위해 밑줄 대신 하이픈(-)을 사용하는 것이 좋습니다.(가독성)

 

5) URI 경로에는 소문자가 적합하다.

URI 경로에 대문자 사용은 피하도록 해야 합니다. 대소문자에 따라 다른 리소스로 인식하게 되기 때문입니다. RFC 3986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하기 때문이지요.

    RFC 3986 is the URI (Unified Resource Identifier) Syntax document

 

6) 파일 확장자는 URI에 포함시키지 않는다.

    http://restapi.example.com/members/soccer/345/photo.jpg (X)

REST API에서는 메시지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI 안에 포함시키지 않습니다. Accept header를 사용하도록 합시다.

    GET / members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg

 

4-3. 리소스 간의 관계를 표현하는 방법

REST 리소스 간에는 연관 관계가 있을 수 있고, 이런 경우 다음과 같은 표현방법으로 사용합니다.

    /리소스명/리소스 ID/관계가 있는 다른 리소스명

    ex)    GET : /users/{userid}/devices (일반적으로 소유 ‘has’의 관계를 표현할 때)

만약에 관계명이 복잡하다면 이를 서브 리소스에 명시적으로 표현하는 방법이 있습니다. 예를 들어 사용자가 ‘좋아하는’ 디바이스 목록을 표현해야 할 경우 다음과 같은 형태로 사용될 수 있습니다.

    GET : /users/{userid}/likes/devices (관계명이 애매하거나 구체적 표현이 필요할 때)

 

4-4. 자원을 표현하는 Colllection과 Document

Collection과 Document에 대해 알면 URI 설계가 한 층 더 쉬워집니다. DOCUMENT는 단순히 문서로 이해해도 되고, 한 객체라고 이해하셔도 될 것 같습니다. 컬렉션은 문서들의 집합, 객체들의 집합이라고 생각하시면 이해하시는데 좀더 편하실 것 같습니다. 컬렉션과 도큐먼트는 모두 리소스라고 표현할 수 있으며 URI에 표현됩니다. 예를 살펴보도록 하겠습니다.

    http:// restapi.example.com/sports/soccer

위 URI를 보시면 sports라는 컬렉션과 soccer라는 도큐먼트로 표현되고 있다고 생각하면 됩니다. 좀 더 예를 들어보자면

    http:// restapi.example.com/sports/soccer/players/13

sports, players 컬렉션과 soccer, 13(13번인 선수)를 의미하는 도큐먼트로 URI가 이루어지게 됩니다. 여기서 중요한 점은 컬렉션은 복수로 사용하고 있다는 점입니다. 좀 더 직관적인 REST API를 위해서는 컬렉션과 도큐먼트를 사용할 때 단수 복수도 지켜준다면 좀 더 이해하기 쉬운 URI를 설계할 수 있습니다.

 

 

 

5. HTTP 응답 상태 코드

마지막으로 응답 상태코드를 간단히 살펴보도록 하겠습니다. 잘 설계된 REST API는 URI만 잘 설계된 것이 아닌 그 리소스에 대한 응답을 잘 내어주는 것까지 포함되어야 합니다. 정확한 응답의 상태코드만으로도 많은 정보를 전달할 수가 있기 때문에 응답의 상태코드 값을 명확히 돌려주는 것은 생각보다 중요한 일이 될 수도 있습니다. 혹시 200이나 4XX관련 특정 코드 정도만 사용하고 있다면 처리 상태에 대한 좀 더 명확한 상태코드 값을 사용할 수 있기를 권장하는 바입니다.

 

 

상태코드

200 클라이언트의 요청을 정상적으로 수행함
201 클라이언트가 어떠한 리소스 생성을 요청, 해당 리소스가 성공적으로 생성됨(POST를 통한 리소스 생성 작업 시)

 

상태코드

400 클라이언트의 요청이 부적절 할 경우 사용하는 응답 코드
401 클라이언트가 인증되지 않은 상태에서 보호된 리소스를 요청했을 때 사용하는 응답 코드
  (로그인 하지 않은 유저가 로그인 했을 때, 요청 가능한 리소스를 요청했을 때)
403 유저 인증상태와 관계 없이 응답하고 싶지 않은 리소스를 클라이언트가 요청했을 때 사용하는 응답 코드
  (403 보다는 400이나 404를 사용할 것을 권고. 403 자체가 리소스가 존재한다는 뜻이기 때문에)
405 클라이언트가 요청한 리소스에서는 사용 불가능한 Method를 이용했을 경우 사용하는 응답 코드

 

상태코드

301 클라이언트가 요청한 리소스에 대한 URI가 변경 되었을 때 사용하는 응답 코드
  (응답 시 Location header에 변경된 URI를 적어 줘야 합니다.)
500 서버에 문제가 있을 경우 사용하는 응답 코드

 

 


참고

 

https://spoqa.github.io/2012/02/27/rest-introduction.html

https://meetup.toast.com/posts/92

https://sanghaklee.tistory.com/57

 

'Coding > 기타' 카테고리의 다른 글

HTTP 이해  (0) 2022.12.06
기술매니저님 추천 사이트 ( Spring 관련 )  (0) 2022.12.02
Error : Address already in use 오류 해결하기  (0) 2022.11.04
피그마 figma  (0) 2022.10.27
JWT 관련 필요한 용어 정리  (0) 2022.10.26

 

 

pytho 파이썬을 이용하여 app.py 를 실행시킬때마다 port 넘버를 5000으로 하면 " Address already in use..." 와 같은 오류 메시지가 뜬다. 최근 맥 업데이트하면서 새롭게 생긴 에어플레이 기능이 5000번 포트를 점유하기 때문이라고 한다.

 

화면켭쳐는 미처 하지 못했지만, 나와 비슷한 오류를 겪는 분들을 위한 해결방법은 아래와 같다.

 

※ 터미널창에 lsof -i :5000 입력 후 엔터, 그리고 kill - 9 pip 값 입력 후 엔터.

lsof -i :5000
kill -9 pip값

 

 


[출처] https://okky.kr/articles/1098226

'Coding > 기타' 카테고리의 다른 글

기술매니저님 추천 사이트 ( Spring 관련 )  (0) 2022.12.02
RESTful API 설계 가이드  (0) 2022.12.01
피그마 figma  (0) 2022.10.27
JWT 관련 필요한 용어 정리  (0) 2022.10.26
JWT 이해하기 (1) - 토큰 기반 인증  (0) 2022.10.26

 

 

피그마는 디자이너가 가장 많이 쓰고 Mac, Windows를 통틀어 가장 인기있는 툴이라고 한다. 

토이프로젝트를 진행하면서 PM이셨던 조원분이 피그마 틀을 이용해 와이어프레임을 만드시는 걸 보고 나도 피그마의 사용이 궁금해졌다.

피그마의 간단한 기능을 알게 되면 다음에 다른 프로젝트를 구상할 때에도 유용하게 사용할 수 있을 것 같다.

지금은 토이프로젝트 직전이라 시간적 여유가 없어서 일단은 유용한 링크들을 모아봤다.

 

 

 

 

 

 

https://www.figma.com/

 

Figma: the collaborative interface design tool.

Build better products as a team. Design, prototype, and gather feedback all in one place with Figma.

www.figma.com

 

https://yozm.wishket.com/magazine/detail/1187/

 

기획자가 알려주는 ‘피그마’ 활용법 | 요즘IT

UX tools 조사에 따르면, 지난해 피그마는 디자이너가 가장 많이 쓰고 맥과 윈도우를 통틀어 가장 인기 있는 UI툴 1위로 선정되었습니다. 코로나19로 재택근무가 확대되면서 피그마가 내세운 ‘

yozm.wishket.com

 

https://cucat.tistory.com/entry/%ED%94%BC%EA%B7%B8%EB%A7%88-%EC%82%AC%EC%9A%A9%EB%B2%95-%EA%B8%B0%EC%B4%88?category=1012603 

 

피그마 사용법 기초 튜토리얼!(가입부터 버튼 만들기까지)

피그마 사용법을 익혀서 속도감 있는 개발을 경험해보세요. 효과적인 Figma 사용법을 알고 싶은 분에게 기본적인 조작 방법과 함께 간단히 버튼 만들기 튜토리얼을 안내하겠습니다. 이 글을 읽으

cucat.tistory.com

https://www.youtube.com/watch?v=GsZk8s5JdWg 

 

 

① 토큰 [ Token ] : 시스템에서 보안 객체의 접근 관리에 사용되는 객체 또는 장치. 서버가 기억하는 이상하게 생긴 텍스트. ID카드 처럼 서버한테 보여줘야 하는 것.

 

② 쿠키 [ cookie ] : 그냥 옮기는 시스템, 매개체. 고객이 특정 홈페이지를 접속할 때 생성되는 정보를 담은 임시 파일. 특정 사이트를 처음 방문하면 아이디와 비밀번호를 기록한 쿠키가 만들어지고 다음에 접속했을 때 별도 절차 없이 사이트에 빠르게 연결할 수 있다. 쿠키는 사용하는 웹브라우저가 자동으로 만들기도 하고 갱신하기도 하며 웹사이트로 기록을 전달하기도 한다. 따라서 개인의 사생활을 침해할 소지가 있다.

③ 프로토콜 [ protocol ] : 송신자와 수신자 사이에 메시지나 데이터 등을 주고 받기 위해 사전에 정해놓은 규칙.

 

④ JWT : JWT(Json Web Token)란 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달한다. 정보를 갖고있는 토근, DB 없이 인증할 수 있음.

 

⑤ JWT 단점 및 고려사항

  • Self-contained: 토큰 자체에 정보를 담고 있으므로 양날의 검이 될 수 있다. 
  • 토큰 길이: 토큰의 페이로드(Payload)에 3종류의 클레임을 저장하기 때문에, 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다. 
  • Payload 인코딩: 페이로드(Payload) 자체는 암호화 된 것이 아니라, BASE64Url로 인코딩 된 것이다. 중간에 Payload를 탈취하여 디코딩하면 데이터를 볼 수 있으므로, JWE로 암호화하거나 Payload에 중요 데이터를 넣지 않아야 한다. 
  • Stateless: JWT는 상태를 저장하지 않기 때문에 한번 만들어지면 제어가 불가능하다. 즉, 토큰을 임의로 삭제하는 것이 불가능하므로 토큰 만료 시간을 꼭 넣어주어야 한다. 
  • Store Token: 토큰은 클라이언트 측에서 관리해야 하기 때문에, 토큰을 저장해야 한다.

출처: https://mangkyu.tistory.com/56 

 

토큰 기반 인증이란?

 

토큰 기반 인증이란 사용자가 자신의 아이덴티티를 확인하고 고유한 액세스 토큰을 받을 수 있는 프로토콜을 말합니다. 사용자는 토큰 유효 기간 동안 동일한 웹페이지나 앱, 혹은 그 밖에 해당 토큰으로 보호를 받는 리소스로 돌아갈 때마다 자격 증명을 다시 입력할 필요 없이 토큰이 발급된 웹사이트나 앱에 액세스할 수 있습니다.

인증 토큰은 도장이 찍힌 티켓과 같습니다. 토큰이 유효하다면 사용자는 계속해서 액세스할 수 있습니다. 사용자가 로그아웃하거나 앱을 종료하면 토큰도 무효화됩니다.

토큰 기반 인증은 비밀번호 기반 또는 서버 기반 인증 기법과는 다릅니다. 토큰이 두 번째 보안 계층을 제공하여 관리자가 각 작업과 트랜잭션을 정밀하게 제어할 수 있습니다.

 

인증 토큰의 역사

인증과 인가 (권한 부여)는 서로 다른 개념이지만 연관성이 있습니다. 인증 토큰을 사용하기 전에는 비밀번호와 서버가 사용되었습니다. 기존 방식을 사용해 적합한 사람이 필요할 때 원하는 정보에 액세스했는지 확인해야 했지만 항상 효과적이지는 못했습니다.

비밀번호를 예로 들면, 일반적으로 다음과 같은 과정이 작용합니다.

  • 사용자 생성. 문자, 숫자, 기호를 조합하여 비밀번호를 생성합니다.
  • 기억. 고유한 비밀번호 조합을 항상 기억해야 합니다.
  • 반복. 액세스가 필요할 때마다 비밀번호를 입력해야 합니다.

또한 유저들은 비밀번호를 일일이 다 기억하지 못하며, 다음과 같은 요령에 의지하는 경우가 많습니다.

  • 비밀번호 기록. 비밀번호가 빼곡히 적힌 종이를 분실할 경우 보안 악몽이 시작됩니다.
  • 비밀번호 재사용. 사람들은 동일한 비밀번호를 여러 계정에서 사용하는 경향이 있습니다. 따라서 한 개의 비밀번호가 분실될 경우 대부분의 계정이 취약해질 수 있습니다.
  • 부분적인 비밀번호 변경. 사람들은 비밀번호를 업데이트해야 할 때 문자나 숫자를 하나만 변경합니다.

비밀번호 역시 서버 인증이 필요합니다. 사람들이 로그인할 때마다 컴퓨터가 트랜잭션 레코드를 생성하며, 결과적으로 메모리 부하가 증가합니다.

하지만 토큰 인증은 다릅니다.

토큰 인증 방식에서는 보조 서비스를 통해 서버 요청을 확인합니다. 확인이 완료되면 서버가 토큰을 발급하여 요청에 응답합니다.

사용자는 여전히  적어도 한 개의 비밀번호 를 기억해야 하지만 토큰이 액세스 계층을 하나 더 제공하기 때문에 도용하거나 침투하기가 훨씬 더 어렵습니다. 또한 세션 레코드가 서버에서 공간을 전혀 차지하지 않습니다. 

 

 

세 가지 유형의 인증 토큰

모든 인증 토큰이 액세스를 허용하지만 각 유형마다 약간씩 차이가 있습니다.

일반적으로 다음과 같은 세 가지 유형의 인증 토큰이 사용됩니다.

  • 연결형: 키, 디스크, 드라이브 및 기타 물리적 장치가 시스템에 연결되어 액세스를 허용합니다. USB 디바이스나 스마트카드를 사용해 시스템에 로그인한 경험이 있다면 연결식 토큰을 사용한 셈입니다.
  • 비접촉형: 디바이스가 서버와 통신하려면 거리가 충분히 가까워야 하지만 연결할 필요는 없습니다. Microsoft의 "매직 링"이라고 하는 토큰이 여기에 해당합니다.
  • 분리형: 디바이스가 다른 디바이스와 접촉하지 않고도 먼 거리에서 서버와 통신할 수 있습니다. 예를 들어 이중 요소 인증 프로세스에 휴대전화를 사용한 경험이 있다면 이러한 유형의 토큰을 사용한 셈입니다.

위의 세 가지 시나리오 모두 사용자가 무언가를 해야만 프로세스가 시작됩니다. 비밀번호를 입력해야 할 수도 있고, 혹은 질문에 답변해야 할 수도 있습니다. 하지만 예비 단계를 완벽하게 마쳤다고 해도 액세스 토큰이 없으면 액세스하지 못합니다. 

 

 

4가지 단계의 간단한 토큰 인증 절차

토큰 기반 인증 시스템을 사용하면 방문자가 자격 증명을 한 번만 확인합니다. 자격 증명이 확인되면 토큰이 할당되어 정해진 시간 동안 액세스가 가능합니다.

프로세스는 다음과 같습니다.

  • 요청: 사용자가 서버 또는 보호되는 리소스에 대한 액세스를 요청합니다. 이때 비밀번호를 이용한 로그인이나 그 밖에 지정된 프로세스가 개입될 수 있습니다.
  • 확인: 서버가 해당 사용자의 액세스 여부를 확인합니다. 이때는 사용자 이름에 대한 비밀번호 확인 또는 그 밖에 지정된 프로세스가 개입됩니다.
  • 토큰: 서버가 링, 키, 휴대전화와 등의 인증 디바이스와 통신합니다. 확인을 마치면 서버가 토큰을 발급하여 사용자에게 전달합니다.
  • 저장: 작업이 지속되는 동안 토큰이 사용자의 브라우저에 저장됩니다.

사용자가 서버에서 다른 곳에 방문하려고 하면 토큰이 서버와 다시 통신합니다. 토큰에 따라 액세스가 허용되기도 하고 거부되기도 합니다.

관리자가 토큰에 대한 사용 제한을 설정하기도 합니다. 예를들어, 사용자가 로그아웃하 지정된 시간이 지나면 토큰이 자동으로 파기되도록 설정할 수 있습니다.

JSON Web Token(JWT): 특별한 인증 토큰

오늘날 휴대전화(앱)와 웹 앱을 통해 시스템에 액세스하는 사용자들이 많아지면서 개발자에게 이러한 플랫폼에 적합한 안전한 인증 방법이 필요해졌습니다.

개발자들은 애플리케이션에 토큰 인증 방식을 도입할 때 이러한 문제를 해결하기 위해 JSON Seb Token(JWT)으로 눈을 돌리고 있습니다.

JSON Web Token(JWT) 개방형 표준입니다. 완성된 코딩 결과물은 발신자와 수신자 사이에서 안전한 통신을 지원합니다. 데이터는 디지털 서명을 통해 확인하며, HTTP를 통해 전송되는 경우에는 데이터를 암호화하여 안전하게 보호합니다.
 

JWT에는 세 가지 중요한 구성요소가 있습니다.

  1. 헤더: 토큰 유형을 비롯해 관련된 서명 알고리즘을 정의합니다.
  2. 페이로드: 토큰 발급자, 토큰 유효기간 등을 정의합니다.
  3. 서명: 보안 서명을 통해 메시지가 전송 과정에서 바뀌지 않은 것을 확인합니다.

코딩은 위의 세 가지 요소로 이어집니다.

JSON 코드를 보고 긴장할 필요는 없습니다. 이러한 유형의 표기는 엔티티가 데이터를 앞뒤로 전달할 때 흔하게 사용되는 것으로, 자습서도 많이 있습니다. JSON 토큰을 사용하고 싶지만 해당 언어를 시도해 본 경험이 없다면 이러한 리소스가 도움이 될 수 있습니다.

 

 

JWT의 장점과 단점

JWT에는 다음과 같은 다양한 장점이 있습니다.

  • 크기: JSON 코드 언어로 생성된 토큰은 용량이 작기 때문에 두 엔티티 사이에서 매우 빠르게 전달됩니다.
  • 용이성: 거의 모든 곳에서 토큰이 생성될 수 있으며, 서버에서 토큰을 확인할 필요가 없습니다.
  • 제어: 액세스 가능한 데이터, 권한 지속 시간, 로그인 시 가능한 작업을 지정할 수 있습니다.

반면 잠재적 단점도 존재합니다.

  • 단일 키: JWT는 단일 키를 이용합니다. 따라서 키가 유출되면 시스템 전체가 위험에 노출됩니다.
  • 복잡성: 이 토큰은 이해하기가 쉽지 않습니다. 개발자가 암호 서명 알고리즘에 정통하지 않다면 자신도 모르게 시스템을 위험에 빠뜨릴 수 있습니다.
  • 제한: 메시지를 모든 클라이언트에게 푸시할 수 없고, 서버 측 클라이언트도 관리할 수 없습니다.

 

인증 토큰을 시도해야 하는 이유

누구나 현재 전략을 평가하고 아무런 문제가 없다고 생각할 수 있습니다. 그런데도 인증 토큰을 시스템에 추가해야 하는 이유는 무엇일까요? 결단을 내리는 개발자들이 실감할 수 있는 이점이 있기 때문입니다.

인증 토큰은 다음과 같은 시스템 관리자에게 유용합니다.

  • 임시 액세스를 자주 허용하는 관리자. 날짜, 시간 또는 특별 이벤트에 따라 사용자 수의 변동 폭이 크면 액세스를 반복해서 허용 또는 취소하느라 쉽게 지칠 수 있습니다. 이때는 토큰이 유용합니다.예를 들어 대학 도서관 사이트의 관리자라면 아마 토큰 접근법의 진가를 알아볼 것입니다.
  • 액세스 세분화가 필요한 관리자. 서버가 사용자 속성이 아닌 특정 문서 속성에 따라 액세스를 허용합니다. 하지만 비밀번호로는 정밀한 세분화가 어렵습니다.예를 들어 온라인 저널을 운영한다고 가정했을 때, 모든 독자가 여러 문서가 아닌 한 문서에서 저널을 읽고 댓글을 달 수 있도록 만들려고 합니다. 이때 토큰을 사용하면 가능합니다.
  • 주요 해킹 표적인 관리자. 유출될 경우 기업에게 심각한 피해를 입힐 정도로 중요한 문서가 서버에 저장되어 있습니다. 비밀번호로만으로는 충분히 보호하기 어렵습니다. 이때는 하드웨어가 큰 도움이 될 수 있습니다.

인증 토큰의 사용 사례는 이 외에도 많습니다. 하지만 위의 사용 사례도 창의력을 발휘하는 데 유용하며, 이점을 고려할수록 인증 토큰을 사용할 가능성도 더 커집니다. 

 

인증 토큰 모범 사례 따라하기

인증 토큰은 보안 프로토콜을 강화하여 서버를 안전하게 보호하는 데 목적이 있습니다. 하지만 안전을 염두에 두고 프로세스를 구축하지 않는다면 인증 토큰도 효과를 발휘하지 못합니다.

인증 토큰은 다음과 같아야 합니다.

  • 비공개. 사용자는 여러 부서 사이에서 토큰 인증 디바이스를 공유하거나 함께 사용할 수 없습니다. 비밀번호를 공유하지 않듯이 보안 시스템에서 어떤 것도 공유해서는 안 됩니다.
  • 보안. 토큰과 서버 간 통신은 HTTPS 연결을 통해 안전하게 보호되어야 합니다. 암호화는 토큰을 안전하게 보호하기 위한 필수 요소입니다.
  • 테스트. 토큰 테스트를 주기적으로 시행하여 시스템이 안전하게 정상적으로 작동하는지 확인해야 합니다. 또한 문제가 발견되면 신속하게 해결해야 합니다.
  • 적합성. 각 사용 사례에 적합한 유형의 토큰을 선택해야 합니다. 예를 들어 JWT의 경우 세션 토큰에 적합하지 않은데, 이는 비용이 만만치 않을 뿐만 아니라 가로채기로 인한 보안 위협을 배제할 수 없기 때문입니다. 따라서 작업에 적합한 툴인지 항상 확인해야 합니다.

인증 토큰을 쉽게 결정해서는 안 됩니다. 직접 알아보거나 동료들에게 물어봐서 회사에게 가장 필요한 일을 하고 있는지 생각해 보는 것이 좋습니다. 

 

출처 : https://www.okta.com/kr/identity-101/what-is-token-based-authentication/

+ Recent posts