재밌고 어려운 IT를 이해해보자~!

로그인 기능 및 토큰생성 본문

React, Node Js

로그인 기능 및 토큰생성

언제나즐거운IT 2024. 5. 5. 23:04

user.js

userSchema.methods.generateToken = function() {
    // jwt 생성
    user = this;
    const token = jwt.sign(user._id.toJSON(), 'secretToken');
    user.token = token;

    return user.save();
}

 

index.js

app.post('/login', (req, res) => {
  // 이메일이 DB에 있는지 확인
  User.findOne({
      email: req.body.email
  })
  .then (async (user) => {
      if (!user) {
          throw new Error("제공된 이메일에 해당하는 유저가 없습니다.")
      }
      // 비밀번호가 일치하는지 확인
      const isMatch = await user.comparePassword(req.body.password);
      return { isMatch, user };
  })
  .then(({ isMatch, user }) => {
      console.log(isMatch);
      if (!isMatch) {
          throw new Error("비밀번호가 틀렸습니다.")
      }
      // 로그인 완료
      return user.generateToken();
  })
  .then ((user) => {
      // 토큰 저장 (쿠키, localstorage ...)
      return res.cookie("x_auth", user.token)
      .status(200)
      .json({
          loginSuccess: true,
          userId: user._id
      });
  })
  .catch ((err) => {
      console.log(err);
      return res.status(400).json({
          loginSuccess: false,
          message: err.message
      });
  })
});

 

JWT 토큰이란?

JWT(Json Web Token)은 Json 객체에 인증에 필요한 정보들을 담은 후 비밀키로 서명한 토큰으로, 인터넷 표준 인증 방식이다. 공식적으로 인증(Authentication) & 권한허가(Authorization) 방식으로 사용된다.

여기서 일반 로그인 과정과 인증 방식을 헷갈릴 수 있다.

 

  1. 사용자가 아이디와 비밀번호 혹은 소셜 로그인을 이용하여 서버에 로그인 요청을 보낸다.
  2. 서버는 비밀키를 사용해 json 객체를 암호화한 JWT 토큰을 발급한다.
  3. JWT를 헤더에 담아 클라이언트에 보낸다.

   여기까지가 JWT를 발급받기까지의 (로그인 전)과정이다. 로그인 이후에는 다음과 같은 과정이 이루어진다.

  1. 클라이언트는 JWT를 로컬에 저장해놓는다.
  2. API 호출을 할 때마다 header에 JWT를 실어 보낸다.
  3. 서버는 헤더를 매번 확인하여 사용자가 신뢰할만한지 체크하고, 인증이 되면 API에 대한 응답을 보낸다.

장단점

 장점

  • 로컬에 저장하기 때문에 서버 용량에 영향을 끼치거나 받지 않는다.
  • 보다 안전하다. (공개키/개인키 or 비밀키를 통해 서명되기 때문에)
  • 모바일 앱에서 사용하기 적합하다.
    모바일 앱은 여러 플랫폼 및 기기에서 동작할 수 있고, 서로 다른 도메인에서 통신할 수도 있다. 이때 JWT를 사용하면 플랫폼 독립적으로 사용자 인증을 처리할 수 있기 때문에 적합하다.
  • 네트워크 부하가 적다.
    http헤더나 url 파라미터를 통해 간단하게 전송되기 때문이다.

 단점

  • 토큰의 크기가 커질수록 트래픽에 영향을 미칠 수 있다.
  • 토큰은 발급되면 만료 기간 변경이 불가능하므로 토큰 만료 처리를 구현해야 한다.

정리

  • 사용 목적 : JWT 토큰은 사용자 인증과 로그인 유지를 위해 쓰인다
  • 토큰의 구조 : Header, Payload, Signature
    • Header: 서명 알고리즘 (공개키/개인키 or 비밀키)
    • Payload : 토큰 정보(대상, 발급시각, 만료시각)
    • Signature : (Header+Payload) 서명 (인증용)
  • 장단점
    • 장점 : 네트워크 부하가 적고 모바일 앱에 사용하기 적합하다
    • 단점 : 토큰 크기를 신경써야하고, 만료 기간 처리를 따로 해줘야한다

 

 

 

 

 

 

 

 

 

 

 

 

 

*참조

https://velog.io/@chuu1019/%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-JWTJson-Web-Token

 

 

 

 

 

 

 

'React, Node Js' 카테고리의 다른 글

logout 기능  (0) 2024.05.07
Authentication  (0) 2024.05.06
Bcrypt  (0) 2024.05.02
Node Mon, 비밀 설정 정보 관리  (0) 2024.05.01
schema 생성 및 회원 가입 기능 제작  (0) 2024.04.30
Comments