재밌고 어려운 IT를 이해해보자~!
로그인 기능 및 토큰생성 본문
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) 방식으로 사용된다.
여기서 일반 로그인 과정과 인증 방식을 헷갈릴 수 있다.
- 사용자가 아이디와 비밀번호 혹은 소셜 로그인을 이용하여 서버에 로그인 요청을 보낸다.
- 서버는 비밀키를 사용해 json 객체를 암호화한 JWT 토큰을 발급한다.
- JWT를 헤더에 담아 클라이언트에 보낸다.
여기까지가 JWT를 발급받기까지의 (로그인 전)과정이다. 로그인 이후에는 다음과 같은 과정이 이루어진다.
- 클라이언트는 JWT를 로컬에 저장해놓는다.
- API 호출을 할 때마다 header에 JWT를 실어 보낸다.
- 서버는 헤더를 매번 확인하여 사용자가 신뢰할만한지 체크하고, 인증이 되면 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