티스토리 뷰

웹개발

JWT

rangrangerang 2019. 7. 12. 17:23


PART 0

토큰(Token)기반 인증

  • 기존의 세션 기반 인증과는 다르게 서버가 사인한 토큰을 이용하여 인증을 수행하는 방식.

1# 특징

  • Stateless 서버 : 서버의 상태를 유지하지 않음(<-> Stateful 서버) 
    => 클라이언트-서버 사이에 연결고리가 없음
    => 서버의 확장성이 높아짐
  • 모바일 어플리케이션에 적함 : 안전한 API를 만들기 위해 토큰 기반 인증을 사용함
  • 인증정보를 다른 어플리케이션으로 전달 : 페이스북/구글 같은 소셜 계정들을 이용하여 다른 웹서비스에서도 로그인 할 수 있음(ex. OAuth)
  • 보안 : 토큰 기반 인증 시스템을 사용하여 어플리케이션의 보안을 높일 수 있다.



2# 토큰 기반 시스템의 작동 원리

  1. 유저가 아이디와 비밀번호로 로그인을 한다.
  2. 서버측에서 해당 계정정보를 검증한다.
  3. 계정정보가 정확하다면, 서버측에서 유저에게 signed토큰을 발급해준다.
  4. 클라이언트 측에서 전달받은 토큰은 저장해두고, 서버에 요청을 할 때 마다 해당 토큰을 함께 서버에 전달한다.
  5. 서버는 토큰을 검증하고, 요청에 응답한다.

=> 웹서버에서 토큰을 서버에 전달할때에는 HTTP요청의 헤더에 토큰값을 포함시켜서 전달한다.






PART 1

JWT란?

  • JWT(JSON Web Token) : 토큰 기반 인증 시스템의 구현체
  • 웹표준(RFC 7519)으로서 두 개체에서 JSON객체를 사용하여 가볍고 자가수용적(self-contained)인 방식으로 정보를 안정성있게 전달해준다.
  • 자가수용적(self-contained) : JWT는 필요한 모든 정보를 자체적으로 지니고 있다. (토큰에 대한 기본정보, 절달할 정보, 토큰이 검증됐다는것을 증명해주는 signature)
    => 두 개체 사이에서 손쉽게 전달 될 수 있다. (웹서버의 경우 HTTP 헤더에 넣어서 전달 할 수도 있고, URL의 파라미터로 전달 할 수도 있다.)

1# 구성

header.payload.signature

  • header : 토큰의 타입과 해시 암호화 알고리즘을 구성되어 있다. 

    {
      "typ": "JWT",
      "alg": "HS256"
    }
  • payload : 토큰에 담을 클레임(claim)정보를 포함하고 있다. name/value의 한 쌍으로 이루어져 있어 여러개의 클레임들을 넣을 수 있다.
    - ex. userId, expire, scope 등
  • signature : secret key를 포함하여 암호화되어 있다.
    => payload에 실린 정보가 위변조 되지 않았는지 체크




2# 예시

  • 회원인증
  1. 사용자가 id와 password를 입력하여 로그인을 시도한다.
  2. 서버는 요청을 확인하고 secret key를 통해 Access token을 발급한다.
  3. 이후 JWT가 요구되는 API를 요청할 때는 클라이언트가 Authorization header에 Access token을 담아서 보낸다.
  4. 서버는 JWT Signature를 체크하고 Payload로부터 user정보를 확인해 데이터를 리턴한다.
  • 정보교류 : 두 개체 사이에서 안정성있게 정보를 교환할 때 사용한다. 정보가 sign이 되어있기 때문에 정보를 보낸이가 바뀌진 않았는지, 정보가 도중에 조작되지는 않았는지 검증할 수 있다.


[Reference] https://velopert.com/2350 https://velopert.com/2389 https://velog.io/@geuni1013/JWT-%EC%A0%95%EB%A6%AC-%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%A6%AC https://jwt.io/ https://medium.com/@mayurkambariya/jwt-authentication-with-angular-7-14aaa8e3fa33 https://blog.outsider.ne.kr/1160 https://artoria.us/25



'웹개발' 카테고리의 다른 글

[PHP - Laravel] 라라벨 디버그모드 설정  (2) 2020.01.09
[POSTMAN] POST로 보냈는데 GET으로 인식하는 문제  (7) 2020.01.09
쿠키/세션/캐시  (1) 2019.07.12
HTTP vs HTTPS  (1) 2019.07.12
[Day2]REST API - HATEOAS  (4) 2019.07.02
댓글