ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 사용자 인증(로그인) 방식
    Web 2019. 5. 27. 01:03

    HTTP는 Stateless 서비스이다.

    기본적으로 각각의 요청을 완전히 별개의 것으로 인식한다.

    현재 요청이 이전 사용자와 같은 사용자인지 판별하려면 

    다음과 같은 방식이 있다.

     

    Basic

    OAuth

     

     

    1. 서버에 사용자 정보를 저장(세션)

    =>사용자수가 많으면 서버자원소모가 심함

    session관리용 서버를 분리해야할수도

     

     

     

    2. 토큰인증 방식

    => ID/PW 일치를 확인하면 서버에서 토큰 발행

    토큰에는 사용자식별정보가 들어가고 위조하기 어려워야한다.

    이런 서비스를 위한 웹 표준으로 JWT, OAuth가 있다.

     

    JWT(Json Web Token)

     

    - 데이터 구조

    aaaaaa.bbbbbb.cccccc

    헤더(header).내용(payload).서명(signature)

     

    - 헤더

    아래의 2가지 정보가 담김

    type : 토큰 타입 (여기선 JWT)

    alg : 해싱알고리즘지정 (HMAC SHA256, RSA 등)

    토큰 검증시 시그니처 부분에 사용됨

    헤더 예시 

     

    {
       "type" : "JWT",
       "alg" : "HS256"
    }

    해당 값을 base64로 인코딩한 값이 헤더부분에 들어감 

     

     

    - 내용

    토큰에 담을 데이터(클레임(claim)이라 부름)

    내용부분엔 여러개의 클레임을 담을 수 있음

    name : value 쌍으로 이루어짐

     

    - 클레임 종류

    등록된(registered) 클레임

    공개(public) 클레임

    비공개(private) 클레임

     

    registered claim 

    토큰에 대한 정보가 담김 

    다음과 같은 항목이 있고 해당 클레임은 모두 선택적(optional)

    iss : 토큰 발급자 issuer

    sub : 토큰 제목 subject

    aud : 토큰 대상자 audience

    exp : 토큰 만료시간(NumericDate 형식사용) 토큰이 언제 끝날지 expiration

    nbf : 토큰 활성날짜(NumericDate 형식사용) 해당 시간값이 지나야 토큰이 활성됨 not before

    iat : 토큰이 발급된 시간 issued at

    jti : JWT 고유 식별자. (중복처리 방지용) 일회용 토큰에 사용시 유용

     

    public claim

     

    충돌을 방지하기위해 클레임 name을 URI형식으로 사용

     

     

    private claim

    양측간 협의하에 사용되는 클레임

    이름이 중복되어 충돌될 수 있으니 주의

     

     

    Payload 예시

     

     

     

    - 서명(signature)

    헤더의 인코딩값.내용 인코딩값  <- 해당 형식을 비밀키(secret key)로 해쉬값 생성

    비밀키는 암호화시 연산에 함께 사용될 비밀값(공개되어선 안됨)

    해당 해쉬를 base64 형태로 나타낸 값이 서명부분에 들어감

    (이때 인코딩은 hex -> base64)

     

    최종 

    헤더인코딩값.내용인코딩값.서명인코딩값

     

    base64 인코딩시 뒤에 = 문자가 한두개 붙을 수 있는데

    토큰을 URL등에 실을때는 =문자로 인해

    의도와 다른결과가 나올 수 있으므로 replace해줌

     

     

    JWT는 많은 언어에서 지원하고있음

    nodejs는 jsonwebtoken 모듈 사용

     

    토큰 생성 함수

    jwt.sign(payload, secret, options, [callback]) 

    callback 지정시 비동기로 작동. 콜백함수 파라미터는 (err, token

    token인자에 토큰 전달 받음 처리하면됨

    미지정시 동기로 작동하며, JWT값을 문자열 형태로 리턴

    payload : 객체,Buffer, 문자열 형태 값

    secret : 사용할 비밀키값 문자열,Buffer 형태 값

    options : 객체형태로 다음의 키값을 선택적으로 지정

    algorithm : 기본값 HS256

    expiresIn : exp 클레임값을 x초 후 또는10h, 2d 같이 rauchg/ms 형태 기간후로 설정

    notbefore : nbf 클레임값을 x초 후 또는 rauchg/ms 형태 기간후로 설정

    audience

    issuer

    jwtid

    subject

    noTimestamp

    header

     

    토큰 검증함수

    jwt.verify(token, secret, [callback])

    callback함수 파라미터는 (err, decoded)

     

     

     

     

    인증 정보 스키마 종류

    인증정보 데이터를 어떤 형태로 구조화할건지

    에 대한 웹표준

    Basic 

    Bearer 

    Digest

    HOBA

    Mutual

     

    다른 호스트 서비스에서 제공하는 스키마도 존재

    AWS4-HMAC-SHA256 : (Amazon Web Service가 제공하는 인증 스키마)

     

     

     

    인증 정보를 요청헤더 어디에 담을까?

    Authorization 요청헤더

    문법

    Authorization : <type> <credentials>

    type : 인증타입(인증스키마 종류)

    credentials : 인증정보. type에 따라 credentials을 생성하는 방식이 다름

     

     

     

     

     

    'Web' 카테고리의 다른 글

    [nodejs] 암호화 - crypto 모듈  (0) 2019.05.31
    클라이언트에서 서버로 데이터 전송(form/ajax-xml, fetch/WebSocket)  (0) 2019.05.29
    [nodejs] express 사용하기  (0) 2019.05.25
    [Web] quick nodejs  (0) 2019.05.25
    Web Secure Headers  (0) 2019.05.17
Designed by Tistory.