core/utils/Csrf.ts

38 lines
1.2 KiB
TypeScript

import { parse, serialize } from 'cookie'
import csrf from 'csrf'
import { IncomingMessage, ServerResponse } from 'http'
import { NextApiRequest, NextApiResponse } from 'next'
import ResponseWrapper from './ResponseWrapper'
const csrfKey = '_csrf'
const Token = new csrf()
export const tokenCreate = ():string => Token.create(process.env.CSRF_SECRET)
export const tokenVerify = (token: string):boolean => Token.verify(process.env.CSRF_SECRET, token)
export const getToken = (req: IncomingMessage, res: ServerResponse) => {
const parsed = parse(req.headers.cookie || '')
let key:string = parsed[csrfKey]
if(!key || !tokenVerify(key)) {
key = tokenCreate()
res.setHeader('set-cookie', serialize(csrfKey, key, {
expires: new Date(+new Date() + 24 * 60 * 60 * 1000),
httpOnly: true,
path: '/'
}))
}
return key
}
export const checkToken = (req: NextApiRequest, res: NextApiResponse, token: string): boolean => {
const parsed = parse(req.headers.cookie || '')
console.log(parsed[csrfKey], token)
if(parsed[csrfKey] !== token || !tokenVerify(token)) {
ResponseWrapper(res, { code: 400, message: 'CSRF 검증 에러' })
return false
} else return true
}