OAuth & JWT 제발 떠먹여줘

Sorbet·2021년 5월 13일
1

codesquad

목록 보기
19/20

인증방식 3가지

: 데이터는 아무한테나 줄수 없다!
어떤사람한테 어디까지의 데이터를 공개해야하는지에 대한 고민의 결과물로 아래 3가지 방식의 인증/인가 방식이 존재해요

  • API Key
  • OAuth2
  • JWT



JWT란?

  • JWT : JSON Web Token
  • 두 기기(컴퓨터) 간 데이터를 전달하는 웹 토큰 방식

    토큰?

  • 의미를 가지는 최소한의 문자 덩어리
  • 원래 의미는 카지노같은데서 쓰이는 칩이나, 동전 하나같은 의미를 가지는 가장 작은 물건 하나를 지칭



JWT 구성요소

  • 3가지인데
    • 헤더(header)
    • 내용(payload)
    • 서명(signature)
  • 구분자는 [ . ]:(쩜) 기호를 기준으로 3가지 구성요소로 구성

    JWT1) 헤더(Header)

  • JWT의 헤더는 두가지로 또 나뉘며
    • typ : 타입
    • alg : 알고리즘
  • typ : 토큰의 타입
    • 항상 "JWT"라는 값이 들어감
  • alg : 해싱 알고리즘
    • 기본적으로 HMAC, SHA256, RSA가 사용
    • 토근을 검증시 signature부분에서 사용

      JWT2) 정보(payload)

  • JWT Payload 에는 토큰을 담을 정보가 들어있습니다.
  • 정보의 한 조각은 클레임(claim)이라고 칭하고
    • 클레임 하나마다 [name] : [value]의 쌍으로 구성됨
  • 토큰에는 여러개의 클레임들을 넣을 수 있다
  • JWT의 정보(payload) 클레임(claim) 3가지종류
    • 등록된(registered) 클레임
    • 공개(public) 클레임
    • 비공개(private) 클레임

      JWT3) 서명(signature)

  • 안전을 위해 암호화를 진행하는데
    • 이때 비밀키방식과, 해쉬화를 진행함(해쉬화 알고리즘은 위에서 선택)
  • 만든 해쉬는 base64형태로 표시



OAuth란?

  • OAuth : Open Authentification
  • 인터넷 사용자들이 비밀번호를 제공하지 않고, 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수있는 개방형 로그인의 표준
  • 대부분의 IT 기업(구글, 페북, 깃헙, 네이버카카오) 등이 사용하고 있으며 타사 애플리케이션 및 웹사이트의 계정에 대한 정보를 공유할 수 있도록 허용



OAuth 관련 용어정리

  • 사용자 : 계정을 가지고 있는 개인
  • 소비자 : OAuth를 사용해 서비스 제공자에게 접근하는 웹사이트 or 애플리케이션
  • 서비스 제공자 : OAuth를 통해 접근을 지원하는 웹 애플리케이션
  • 소비자 비밀번호 : 서비스 제공자에서 소비자가 자신임을 인증하기 위한 키
  • 요청 토큰 : 소비자가 사용자에게 접근권한을 인증받기 위해 필요한 정보가 담겨있음
  • 접근 토큰 : 인증 후에 사용자가 서비스 제공자가 아닌 소비자를 통해 보호 자원에 접근하기 위한 키 값

    두가지 방식의 토큰

  • Access Token : Access Token은 만료시간이 있고 끝나면 다시 요청해야 함
  • Refresh Token : Refresh Token은 만료되면 아예 처음부터 진행해야 함



OAuth 를 통한 인증과정 간략설명

  1. 소비자가 서비스 제공자에게 요청토큰을 요청
  2. 서비스 제공자가 소비자에게 요청토큰을 발급
  3. 소비자가 사용자를 서비스제공자로 이동 && 사용자 인증이 수행
  4. 서비스 제공자가 사용자를 소비자로 이동
  5. 소비자가 접근토큰을 요청
  6. 서비스제공자가 접근토큰을 발급
  7. 발급된 접근토큰을 이용해서 소비자에서 사용자 정보에 접근





생략한 JWT의 정보(payload) 클레임(claim) 3가지

# 등록된(registered) 클레임
등록된 클레임들은 서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보들을 담기위하여 이름이 이미 정해진 클레임들입니다. 등록된 클레임의 사용은 모두 선택적(optional)이며, 이에 포함된 크레임 이름들은 다음과 같습니다.
iss : 토큰 발급자 (issuer)
sub : 토큰 제목 (subject)
aud : 토큰 대상자 (audience)
exp : 토큰의 만료시간(expiration), 시간은 NumericDate 형식으로 되어있어야 하며 언제나 현재 시간보다 이후로 설정되어 있어야 합니다.
nbf : Not before을 의미하며, 토큰의 활성 날짜와 비슷한 개념입니다. 여기에도 NumericDate형식으로 날짜를 지정하며, 이 날짜가 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않습니다.
iat : 토큰이 발급된 시간(issued at), 이 값을 사용하여 토큰의 age가 얼마나 되었는지 판단 할 수 있습니다.
jti : JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됩니다. 일회용 토큰에 사용하면 유용합니다.
#공개(public) 클레임
공개 클레임들은 충돌이 방지된(collision-resistant)이름을 가지고 있어야 합니다. 충돌을 방지하기 위해서는, 클레임 이름을 URI형식으로 짓습니다.
{
"https://chup.tistory.com/jwt_claims/is_admin" : true
}
- 비공개(private) 클레임
등록된 클레임도 아니고, 공개된 클레임들도 아닙니다. 양 측간에(보통 클라이언트 <-> 서버) 합의하에 사용되는 클레임 이름들입니다. 공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야합니다.




참고링크

링크1
링크2

profile
Sorbet is good...!

1개의 댓글

comment-user-thumbnail
2021년 6월 2일

덕분에 배부르네요 감사합니다

답글 달기