-
사용자 인증(로그인) 방식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