인프런 커뮤니티 질문&답변

D_One님의 프로필 이미지

작성한 질문수

Node.js 교과서 - 기본부터 프로젝트 실습까지

스스로 해보기3(클라이언트/서버 비밀키 구분하기)

질문이요.

작성

·

212

0

현재 두개의 시크릿키 client 와 frontSecret 키들이 있잖아요.

 

1.

clinentSecret 키는 서버간의 인증을 위한 키 

frontSecret키는 프론트에서 서버로 보내줄때 인증을 위한키

보안상의 이유로 클라이언트 키가 프론트에서 보이는 것 보다

프론트 키가 프론트에서 보이는 걸 선호하는 이유가, 프론트키 와 유저가 직접입력한 도메인을 알아야 기에 좀 더 안전해서 프론트 키를 쓴다. 

지금 제가 이해 한게 맞나요?

 

2.

현재 프론트에서 보내는 프론트 키 + 도메인으로 토큰을 발급 받을때요. 

localhost:8003/ 을 입렵하면, 

라우터 / 이거 에서 frontSecret 키를 main.pug 로보내고, 

main.pug는 다시 locallhost:8002/v2/token 으로 보낸후, 

이 라우터 안에서

DB에 제대로 유저가 등록한 도메인으로 요청을 했는지,

where: { host: url.parse(req.get('origin')).host } 로 

DB 체크후  CORS로 넘겨진후..

 

/token 라우터로 가서, 보내준 frontKey가 맞는지 체크하고 

토큰을 발급을 해주잖아요. 

그래서 /token 라우터 코드를 

const { frontSecret } = req.body; 프론트키받고

where: { frontSecret }  이런식으로 DB에서 체크후 

DB에 프론트키가 있는지 여부를 보고, 토큰을 발행해주나요. 

 

그렇다면, 이전에 clientSeceret 키로 주고 받았잔아요.

예를 들면, nodebird-call 을 보시면, 

request 함수에, 

const URL = 'http://localhost:8002/v2';
const request = async (req, api) => {
try {
if (!req.session.jwt) { 
const tokenResult = await axios.post(`${URL}/token`, {
clientSecret: process.env.CLIENT_SECRET,
});
.......}

 

이런식으로 axios를 통해서 http://localhost:8002/v2/token 에다가, clientSecret을 

보내고, 위와 같은 흐름으로 client 키를 통해서

v2.js 에서 도메인도 체크하고난후, 

/token 라우터를 통해서,  

const { frontSecret } = req.body; 프론트키받고

where: { frontSecret }  이런식으로 DB에서 체크후 

체크를 하는데 , 문제는 frontSecret을 받으려고하잖아요.

 

이럴경우는 clientSecret을 따로 받을 수 있게, 

v2-1.js 이런식으로 새로 만들고,

아예  http://localhost:8002/v2-1/token 이런식으로 요청을 받을수 있게 하는게 나은가요 ??

 

3. 그리고, 만약에 clientSecret만 으로 토큰을 

받는다면, 도메인 체크는 할 필요가 없어지는게 맞죠?

애초에 프론트에 나오지 않아 해킹에 위험이 적어지니까요.

답변 3

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2019. 08. 18. 12:58

1. 프론트 키는 프론트 환경에서 무조건 노출되게 되는데, 노출돼도 안전하기 때문에 씁니다.

2. 아뇨, v2/token 한 라우터에서, 프론트에서 요청을 보냈는지, nodebird-call같은 서버에서 요청을 보냈는지에 따라 frontSecret을 쓸지, clientSecret을 쓸지 분기 처리하는게 좋습니다.

3. 도메인 체크도 하는 것이 좋습니다. 보안 체크는 철저할 수록 좋아요.

0

libertines11님의 프로필 이미지

2019. 09. 18. 19:08

제가 제대로 이해한건진 모르겠지만...

views/main.pug 에서 요청한건 프런트라고보고

routes/index.js 에서 요청한건 서버라고 볼때

main.pug에선 frontSecret 키를 보내고

index.js 에서는 clientSecret 키를 보내면

api 쪽의 v2.js 에서 if문으로 나눠서 프런트와 서버키를 구분해서 처리하면 될것 같아요

0

문장훈님의 프로필 이미지

2019. 09. 09. 09:23

프론트에서 보낸 요청인지, 서버에서 보낸 요청인지 어떻게 구분할 수 있는건가요?? 요청을 받는 서버 입장에서는 같은 요청 아닌가요?   혹시...어떤 시크릿 키를 보내왔는지에 따라서 구분하는 건가요?

D_One님의 프로필 이미지

작성한 질문수

질문하기