Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- AWS
- vuex
- mongoose
- react native
- Foreign Key
- list
- Generic
- animation
- class component
- Filter
- ReactNative
- 생명주기
- elementAt
- Interface
- Swift
- function
- Kotlin
- LiveData
- collection
- Service
- CLASS
- MINUS
- ConstraintLayout
- enum
- map
- recyclerview
- docker
- docker-compose
- union
- lifecycle
Archives
- Today
- Total
개발 일기
JWT 사용자 인증 구현 본문
JWT (Json Web Token)?
그동안 많은 서비스들은 사용자 인증을 구현하기 위해서 다양한 방법을 적용하였습니다.
오늘은 JWT에 대해서 설명하도록 하겠습니다.
JWT는 Session / Cookie 방식과는 다른 Token 기반의 인증 방식 입니다.
Session / Cookie 방식에 대해서 간단하게 설명을 하자면 아래와 같은 순서대로 이루어지게 됩니다.
1) 사용자 로그인
2) 서버에서 사용자를 확인 후에 사용자의 고유 ID를 발생 후 세션 저장소에 저장후에 , 이와 연결되는 세션 ID를 발행
3) 사용자는 해당 값을 Cookie에 저장한 후에 요청을 할때마다 세션ID를 보냅니다.
4) 서버에서 해당 값을 받아서 세션 저장소에서 확인을 한 후에 정보를 가져옵니다.
5) 인증이 완료 후 권한이 허락된 사용자에게 해당 정보를 보여줍니다.
JWT 방식은 위와 방식과는 다르게 사용자 정보를 JSON을 담아서 이를 암호화를 한 후에 해싱 작업을 거쳐서 문자열 토큰을 발행하게 됩니다.
따라서 JWT는 서버에 저장하지 않기 때문에 관련 저장소가 필요하지 않으며 , 해싱을 통해 데이터 무결성을 보장하는 인증 방식입니다.
Node JS에서는 "jsonwebtoken"이라는 좋은 라이브러리를 제공합니다.
아래는 해당 예시입니다.
router.post("/signup"), async(req , res ,next) => {
try {
const salt = await bcrypt.genSalt(10);
const hash = await bcrypt.hash(req.body.user_pass, salt);
let id = await Auth.createUser()
// 해당 토큰 내용(payload) 값은 알수 있기때문에 사용자의 중요한 정보를 안하는것이 좋습니다.
const token = jwt.sign({id : id}, app.get('secret') // 비밀키 , {
expiresIn: '7d' // 유효시간
});
res.cookie("auth", token,{ maxAge: 1000 * 60 * 10, httpOnly: true });
// 원하시는 응답값 하시면 됩니다!
res.json({token})
} catch (error) {
// 원하시는 에러 메시지 노출
res.json({error : "INTERNET SERVER ERROR"})
}
})
인증하실때에는 아래와 같이 할수가 있습니다.
async (req, res, next) => {
const token = req.cookies['auth']; // Header Token
if (token) {
try {
const user = jwt.verify(token, app.get('secret') // 비밀키);
// JWT에 대한 사용자의 정보로 가져옵니다.
req.user = await Auth.getUserId(user['id']);
if(req.user){
return next();
}else {
return next(new Error('User has been deleted'))
}
} catch (error) {
return next(new Error('jwt Parsing Error'));
}
}
return next(new Error('No token provided'));
}
추가적으로 sign() 함수는 HMAC SHA256 알고리즘을 사용합니다.
해당 알고리즘을 변경하고 싶을때에는 여기를 클릭해 주세요.
'서버 > Node.js' 카테고리의 다른 글
Graphql ? (0) | 2020.08.13 |
---|---|
TypeGraphQL ? (0) | 2020.06.05 |
Sequelize-cli 간단한 사용방법 (0) | 2020.05.29 |
mongoose query builder ? (0) | 2020.05.28 |
mongoose ? (0) | 2020.05.27 |
Comments