Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FEAT: 토큰으로 User 정보를 요청하는 API 추가 요청 #246

Closed
bear-bear-bear opened this issue Jul 15, 2021 · 15 comments · Fixed by #248
Closed

FEAT: 토큰으로 User 정보를 요청하는 API 추가 요청 #246

bear-bear-bear opened this issue Jul 15, 2021 · 15 comments · Fixed by #248
Labels
backend 백엔드 작업 help wanted 와서 좀 도와 plan 기획 및 기능 제안 이슈

Comments

@bear-bear-bear
Copy link
Owner

bear-bear-bear commented Jul 15, 2021

`/api/auth/user?accessToken=${memoryStorage.get(ACCESS_TOKEN)}`,

위과 같은 형식으로 쿼리에 액세스 토큰을 담아 요청을 보냈을 때, (url 형식은 입맛대로 수정해주세요! 임의로 적은겁니다)

해당 엑세스 토큰이 유효할 경우의 응답
혹은 해당 액세스 토큰이 유효하지 않아 쿠키의 리프레쉬 토큰으로 유효성을 검증한 경우의 응답 (새로운 accessToken, expiration을 얹어서 보냄)

export interface IUserGetSuccessResponse extends IGeneralServerResponse, IUserProps {
  isLoggedIn: true;
  accessToken?: string;
  expiration?: string;
}

액세스 토큰과 리프레쉬 토큰 모두 유효하지 않을 경우 응답

export interface IUserGetFailureResponse extends IGeneralServerResponse {
  isLoggedIn: false;
}

위의 두 응답이 오는걸 원합니다.
타입 관련 자세한 내용은 #241 의 next/typings/auth.ts 를 참고해주세요

@galaxy4276
Copy link
Collaborator

galaxy4276 commented Jul 15, 2021

** GET 방식으로 이러한 데이터를 다룰 때 **
image
accessToken 같은 보안이 필요한 데이터는 URL 에 노출시키고 싶지 않습니다.
POST 요청으로 Body 에 포함시키게 끔 작성해드리겠습니다.

네트워크에서 Body 또한 열어서 확인해볼 수 있긴 하지만, GET 방식의 URL 은 외부에 공공연하게 드러내게 되는 방식이라 최소한의 보안 의식이라고 생각해주시면 좋습니다.

@bear-bear-bear
Copy link
Owner Author

swr에 들어가는 url입니다. 제가 알기로 swr은 get 요청만 가능하고 그게 아니더라도 get을 쓰는게 취지에 맞다고 들었는데 맞나요?,

@bear-bear-bear
Copy link
Owner Author

swr에 쓰이는 만큼 브라우저 url에서 노출되거나 하는 우려는 안하셔도 될 듯 한데 어떻게 생각하시나요

@galaxy4276
Copy link
Collaborator

swr에 쓰이는 만큼 브라우저 url에서 노출되거나 하는 우려는 안하셔도 될 듯 한데 어떻게 생각하시나요

이말씀은 이해가 안되네요.

@bear-bear-bear
Copy link
Owner Author

아 네트워크 탭 열면 바로 보이는구나

@galaxy4276
Copy link
Collaborator

swr에 들어가는 url입니다. 제가 알기로 swr은 get 요청만 가능하고 그게 아니더라도 get을 쓰는게 취지에 맞다고 들었는데 맞나요?,

다른 method 요청도 지원합니다.
post 사용해도 될 듯합니다.

@bear-bear-bear
Copy link
Owner Author

vercel/swr#93

사용해도 되는거.. 맞겠지요?

@bear-bear-bear
Copy link
Owner Author

난 몰라 난 몰라 정말 몰라 ~ 말해줘도 몰라 몰라 ~

@galaxy4276
Copy link
Collaborator

GET으로 이루어지는 혜택을 누리겠다면, url에 노출시키지 않고 구현해보죠

@bear-bear-bear
Copy link
Owner Author

?? 형그거 가능해?

@galaxy4276
Copy link
Collaborator

가능할 거 같아요 만약 불가능하면 어쩔수 없이 예시방안대로 구현해볼게요

@bear-bear-bear
Copy link
Owner Author

호에엥

@galaxy4276
Copy link
Collaborator

galaxy4276 commented Jul 16, 2021

본문 내용 이해가안가는 점과 인증 실패경우 그렇게 줄수없는 점 2가지 말씀드리겠습니다.

export interface IUserGetSuccessResponse extends IGeneralServerResponse, IUserProps {
  isLoggedIn: true;
  accessToken?: string;
  expiration?: string;
}

accessToken 으로 유저 로그인 검증에도 반환값에 accessToken, expiration 가 올 수 있다는 건가요?
이 값이 필요한지는 모르겠으나, 본문 내용 이해가 어렵네요..
두 경우에 대해 한 타입을 같이쓴다는 내용이면 왜 그렇게 사용하나요?

해당 엑세스 토큰이 유효할 경우의 응답
혹은 해당 액세스 토큰이 유효하지 않아 쿠키의 리프레쉬 토큰으로 유효성을 검증한 경우의 응답 (새로운 accessToken, expiration을 얹어서 보냄)

현재 accessToken 은 헤더에 실어보내기로 되어있었고, 그 방식대로 사용하면 url 에 넣어서 보내지 않아도 됩니다.
이걸 다시 말씀드리는 이유는,
토큰 인증자체가 만료된 경우 NestJS 는 해당 요청을 받지않게 처리하고 있습니다.
결과적으로는 401 UnAuthorized 를 반환받게 될겁니다.
isLoggedIn: false 로 검증하기보단 실패의 경우 예외에서 처리하시면 될 듯 하네요.

@galaxy4276
Copy link
Collaborator

galaxy4276 commented Jul 16, 2021

본문 내용 이해가안가는 점과 인증 실패경우 그렇게 줄수없는 점 2가지 말씀드리겠습니다.

export interface IUserGetSuccessResponse extends IGeneralServerResponse, IUserProps {
  isLoggedIn: true;
  accessToken?: string;
  expiration?: string;
}

accessToken 으로 유저 로그인 검증에도 반환값에 accessToken, expiration 가 올 수 있다는 건가요?
이 값이 필요한지는 모르겠으나, 본문 내용 이해가 어렵네요..
두 경우에 대해 한 타입을 같이쓴다는 내용이면 왜 그렇게 사용하나요?

해당 엑세스 토큰이 유효할 경우의 응답
혹은 해당 액세스 토큰이 유효하지 않아 쿠키의 리프레쉬 토큰으로 유효성을 검증한 경우의 응답 (새로운 accessToken, expiration을 얹어서 보냄)

현재 accessToken 은 헤더에 실어보내기로 되어있었고, 그 방식대로 사용하면 url 에 넣어서 보내지 않아도 됩니다.
이걸 다시 말씀드리는 이유는,
토큰 인증자체가 만료된 경우 NestJS 는 요청을 받지 않습니다.
결과적으로는 401 UnAuthorized 를 반환받게 될겁니다.
isLoggedIn: false 로 검증하기보단 실패의 경우 예외에서 처리하시면 될 듯 하네요.

Nest Guard 의 라이브러리 구현 내부 로직을 파악하고 새로 작성해서, isLoggedIn bool 값으로 던져주게 작성하겠습니다.
일단 결론적으로 반환 값은 하나가 될 것 같습니다.
isLoggedIn: boolean

@galaxy4276
Copy link
Collaborator

PR 내용 확인해보시고 추가사항 있으시면 말씀해주세요.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend 백엔드 작업 help wanted 와서 좀 도와 plan 기획 및 기능 제안 이슈
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants