본문 바로가기
IT/React

JWT

by 봉즙 2019. 12. 2.

JWT : JSON Web Token의 약자로 데이터가 JSON으로 이루어진 토큰을 의미

세션 기반 인증 : 사용자가 로그인하면 서버는 세션 저장소에 사용자의 정보를 조회하고 세션 id를 발급하며 발급된 id를 주로 브라우저의 쿠키에 저장하며 사용자가 요청을 보낼때 마다 서버는 세션 저장소에서 세션을 조회한 후 로그인 여부를 결정하여 작업을 처리하고 응답한다. 저장소로는 주로 메모리, 디스크, 데이터베이스를 사용한다.

세션 기반 인증의 단점은 서버를 확장하기가 번거로워질 수 있다는 점이다. 만약 서버의 인스턴스가 여러개라면 모든 서버끼리 같은 세션을 공유해한다.

 

토큰 기반 인증 : 토큰은 로그인 이후 서버가 만들어주는 문자열이며 해당 문자열안에는 사용자의 로그인 정보가 들어있고, 해당 정보가 서버에서 발급되었음을 증명하는 서명이 들어있다. 주로 HMAC SHA 256혹은 RSA SHA 256 알고리즘을 사용한다. 서버에서 만들어준 토큰은 서명이 있기에 무결성이 보장된다. 사용자가 로그인을 하면 사용자에게 해당 사용자의 정보를 지닌 토큰을 발급해주고 사용자가 요청을 하게되면 발급 받은 토큰과 함께 요청되며 해당 토큰이 유효한지 검사하고 결과에 따라 작업을 처리하고 응답한다.

토큰 기반 시스템의 장점은 서버에서 사용자 로그인 정보를 기억하기 위해서 사용하는리소스가 매우적다. 사용자쪽에서 토큰을 가지고 있으므로 서버의 확장성이 매우 높으며, 인스턴스가 여러개로 늘어나도 서버끼리 사용자의 로그인 상태를 공유할 필요가 없다.

무결성 : 정보가 변경이나 위조되지 않았음을 의미하는 성질

모델 메서드 : 모델에서 사용할 수 있는 함수, 두가지 종류가 존재한다.
첫번째, 인스턴스메서드로 모델을 통해 만든 문서 인스턴스에서 사용할 수 있는 함수
두번째, 스태틱 메서드로 모델에서 바로 사용할 수 있는 함수

인스턴스 메서드 작성시 화살표 함수가 아닌 function 키워드를 사용하여 구현해야한다. 함수 내부에서 this에 접근해야하기 때문이며 this는 문서 인스턴스를 가리키는데 화살표 함수 사용시 this는 문서인스턴스를 가리키지 못하게 된다.

UserSchema.methods.setPassword = async function(password) {
    const hash = await bcrypt.hash(password, 10);
    this.hashedPassword = hash;
};

UserSchema.methods.checkPassword = async function(password) {
    const result = await bcrypt.compare(password, this.hashedPassword);
    return result;
};

 

스태틱함수에서 this는 모델을 가리킨다. 현재코드에서는 User

UserSchema.statics.findByUsername = function (username) {
    return this.findOne({username});
};

 

JWT 토큰을 만들기 위해서는 jsonwebtoken이라는 모듈이 필요하다.

 

사용자가 브라우저에서 토큰 사용할때는 주로 두가지 방법을 사용

첫번째는 브라우저의 localStorage 혹은 sessionStorage에 담아서 사용하는 방법

두번째는 브라우저의 쿠키에 담아서 사용

첫번째 방법의 경우 사용하기가 편리하고 구현이 쉬우나 토큰을 탈취하는 공격 XSS에 취약하다.

쿠키의 경우 httpOnly라는 속성을 활정화하면 자바스크립트를 통해 쿠키를 조회할 수 없으므로 악성 스크립트로 부터 안전하나 CSRF라는 공격에 취약하게된다.

 

 

'IT > React' 카테고리의 다른 글

Koa  (0) 2019.11.27
서버 사이드 렌더링  (0) 2019.11.25
코드 스플리팅  (0) 2019.11.22
리덕스  (0) 2019.11.19
SPA  (0) 2019.11.18

댓글