refreshToken cookie에 저장할때에 템플릿 리터럴 사용하는 부분에서의 질문
//auth.service.ts
import { Injectable, UnprocessableEntityException } from '@nestjs/common';
import { UsersService } from '../users/users.service';
import * as bcrypt from 'bcrypt';
import { JwtService } from '@nestjs/jwt';
import {
IAuthServiceGetAccessToken,
IAuthServiceLogin,
IAuthServiceSetRefreshToken,
} from './interfaces/auth-service.interface';
@Injectable()
export class AuthService {
constructor(
private readonly userService: UsersService, //
private readonly jwtService: JwtService,
) {}
async login({ email, password, context }: IAuthServiceLogin) {
// 1. 이메일이 일치하는 유저를 DB에서 찾기
const user = await this.userService.findOneByEmail({ email });
// 2. 일치하는 유저가 없으면?! 에러 던지기!!!
if (!user)
throw new UnprocessableEntityException('존재하지 않는 이메일입니다.');
// 3. 일치하는 유저가 있지만, 비밀번호가 틀렸다면?!
const isAuth = await bcrypt.compare(password, user.password);
if (!isAuth) throw new UnprocessableEntityException('틀린 암호입니다.');
// 4. refreshToken(=JWT)을 만들어서 브라우저 쿠키에 저장해서 보내주기
this.setRefreshToken({ user, context });
// 5. 일치하는 유저도 있고, 비밀번호도 맞았다면?!
// => accessToken(=JWT)을 만들어서 브라우저에 전달하기
return this.getAccessToken({ user });
}
getAccessToken({ user }: IAuthServiceGetAccessToken): string {
return this.jwtService.sign(
{ sub: user.id },
{
secret: process.env.JWT_SECRET_KEY,
expiresIn: process.env.JWT_ACCESS_TOKEN_EXPIRE,
},
);
}
setRefreshToken({ user, context }: IAuthServiceSetRefreshToken): void {
const refreshToken = this.jwtService.sign(
{ sub: user.id },
{
secret: process.env.JWT_REFRESH_SECRET_KEY,
expiresIn: process.env.JWT_REFRESH_TOKEN_EXPIRE,
},
);
//개발환경
context.res.setHeader(
'set-Cookie',
`refreshToken=${refreshToken}; path=/;`,
);
// 배포환경
// context.res.setHeader('set-Cookie', `refreshToken=${refreshToken}; path=/; domain=.mybacksite.com; SameSite=None; Secure; httpOnly`);
// context.res.setHeader('Access-Control-Allow-Origin', 'https://myfrontsite.com');
}
}
리프레쉬 토큰을 생성하는 과정에서 개발환경에 사용하는
context.res.setHeader(
'set-Cookie',
`refreshToken=${refreshToken}; path=/;`,
);이 코드에 'refreshToken'의 이름을 <한글>로 사용하게되면 graphql로 API테스트를 할때 read에 대한 에러를 발생시키더라구요.
쿠키의 이름을 바꿔서 생성하려고 했는데 한글로 생성이 되지 않는거는 nodejs의 기본 특성인걸까요!?
참고이미지로 아래에 이미지를 붙여봅니다~
궁금해요~~~ 이런내용들은 nodejs 공식문서에서 제가 잘 못찾는건지 궁금합니다. 공식문서에도 있을것 같아서 찾아보려고했는데 잘 못찾겠더라구요ㅠㅜ..

답변 2
1
안녕하세요! zeler1004님!
해당 문제는 nodejs와는 상관이 없습니다!
또한, graphql과도 상관이 없습니다!
마지막으로, 쿠키에서 한글을 사용하지 못하는 것도 아니예요!
다만, 문제는 http 통신으로 브라우저 <==> API서버간 데이터를 주고받기 위해서 header에 한글이 들어가면 안됩니다.
따라서, 보여주신 부분에서는 API서버 => 브라우저 전송시 에러가 발생하였지만,
그 반대의 경우인, 브라우저 => API서버도 header에 한글을 넣어서 전송할 수 없습니다!^^
1
안녕하세요, 인프런 AI 인턴이에요.
해당 코드는 NestJS 프레임워크를 사용하여 구현된 코드인 것 같습니다. 코드를 보면, SetRefreshToken 메서드를 사용하여 refreshToken (JWT 토큰)을 생성하고, 이를 쿠키에 저장하여 전달하는 것을 확인할 수 있습니다.
그리고 refreshToken을 쿠키에 저장할 때, 템플릿 리터럴을 사용하지 않고도 저장이 가능합니다. 다음은 refreshToken을 쿠키에 저장하는 예시 코드입니다.
res.cookie('refreshToken', refreshToken, { httpOnly: true, path: '/auth/refresh_token' });
여기서 ‘refreshToken’은 키 값, refreshToken은 생성한 JWT 토큰 값입니다. ‘httpOnly: true’는 자바스크립트로 쿠키에 접근하지 못하도록 하는 옵션입니다.
더 자세한 내용은 NestJS와 JWT 토큰, 쿠키에 대해 공부하시면 도움이 되실 거 같아요. 감사합니다 :)
74. 데이터 캐시 - 1 (이론) 강의 영상 누락
0
29
1
인가 코드 발급(프론트 vs 백)
0
29
2
lucide react 아이콘 설치
0
46
2
02-04 layout.tsx 구조가 달라요
0
60
2
10-6 실습 할 수 없습니다..
0
81
1
그림 예제는 따로 제공이 안되나요?
0
78
1
cacheLife에 대한 질문입니다
0
69
1
(제보) 쿠키를 브라우저 개발 환경에서 직접 삽입했을 때 나오지 않는 현상
0
70
2
디스코드 채널 초대 링크
0
69
1
동일하게 실습하는데 이상하게 페이지를 찾지 못하네요..
0
72
2
revalidatePath 질문 있습니다.
0
62
2
MainLayout이 중첩되어 뜨는 문제
0
81
2
쿠키와 헤더
0
62
2
구지 react를 사용하는 이유가 그럼 있는가?
0
81
1
카카오 클라이언트 시크릿
0
199
2
FormEvent가 deprecated 되었다고 합니다.
0
251
2
터보백이 안보입니다
0
65
2
젯브레인 웹스톰(jetbrains webstorm) 사용하시는 분들 참고
0
110
2
소스 코드 다운로드는 어디서 하나요.
0
78
2
22. REST 방식 컨트롤러 만들기(2), 29. 등록처리 부분 질문이 있습니다.
0
74
2
37강. 강의수업듣다 질문드립니다.
0
56
2
TodoDTO test 함수
0
80
3
로거 객체 질문
0
56
1
강사님 오타 있음요
0
77
2





