고민 과정
- 상황
- Access Token과 Refresh Token 발급하고 클라이언트에 어디에 담아 응답을 줄지 고민을 했다.
- 마찬가지로 클라이언트가 서버에 요청을 보낼때는 어디에 Access Token을 담아야 서버가 사용자 인증(JWT 검증)을 할 수 있을까?
- 의문
- response body, 쿠키, 헤더에 담는 방법이 있느데 과연 어디에 담아 서버가 클라이언트에 응답(토큰 발급) / 클라이언트가 서버에 요청(사용자 인증)을 보내는게 맞는걸까?
- 결론
- 처음에 XSS보안을 고려해 클라이언트가 쿠키에 저장할 수 있도록 Access token과 Refresh token을 쿠키에 넣어 클라이언트에 보냈다. (set-cookie로 요청 헤더에 담음) -> 클라이언트가 토큰을 쿠키에 저장한다고 서버에서도 쿠키에 저장할 필요는 없다.
- 토큰 발급할 때(서버가 클라이언트에 응답), response body에 담는다.
- 그 외 요청(클라이언트가 서버에 요청)할 때는 사용자 인증을 하기 위해 HTTP헤더인 AUTHORIZATION Header에 담아 요청한다.
토큰 발급할 때, 어떻게 response body에 담을까?
OKTA 기업이 스폰하고 있는 https://www.oauth.com/ 사이트를 참고했다.
OKTA는 Gartner에서 2023년에 Okta가 Gartner Peer Insights Customers' Choice로 선정되었다는데 Okta의 고객들이 Access Management 분야에서의 제품과 서비스에 대해 높은 만족도를 가지고 있다는 것을 의미한다.
Access Token 응답에 아래와 같은 속성을 포함한다.(https://www.oauth.com/oauth2-servers/access-tokens/access-token-response/)
- access_token (required)
- token_type (required)
- expires_in (recommended)
- refresh_token (optional)
- scope (optional)
애플공식문서(https://developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens)에서도 토큰을 발급받고 응답값을 비슷하게 준다
최종적으로 내 프로젝트에서는 access_token과 refresh_token은 jwt 토큰이기 때문에 (만료일자가 포함되어 있음) 다음 속성만 응답값으로 정의했다.
- accessToken
- refreshToken
- tokenType
그렇다면 JWT 은 왜 HTTP헤더로 주고받을까?
처음 IETF에 의해 JWT 가 제안된 RFC7519 문서에서 Authorization Header를 통해 encrypted jwt 를 주고 받도록 protocol 로서 규정했기 때문이다.
또한 JWT는 헤더나 바디에 담아도 될 만큼 충분히 작은 크기라고 말하고 있다. (부록 B)
결국은 JWT는 Authorization Header통해서 전달하자고 "약속"을 했기 때문에 Header에 실어서 보내주고, 실질적으로 body를 통해 보내주어도 동작에 문제가 생기지는 않는다는 것이다.
참고
https://www.oauth.com/oauth2-servers/access-tokens/access-token-response/
https://developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens
https://datatracker.ietf.org/doc/html/rfc7519#section-1
https://velog.io/@kwontae1313/JSON-Web-Token은-왜-헤더로-주고받을까
https://velog.io/@hyex/HTTP-Authorization-header에-Bearer와-jwt-중-무엇을-사용할까
'Backend > JWT' 카테고리의 다른 글
[JWT] JWT 인증/인가 적용기(4) - AccessToken이 만료된 경우 (0) | 2024.02.28 |
---|---|
[JWT] JWT 인증/인가 적용기(3) - 로그인 (2) | 2024.02.27 |
[JWT] JWT 인증/인가 적용기(2) - Spring Security를 통한 JWT 적용 (0) | 2024.01.29 |
[JWT] JWT 인증/인가 구현기(1) - Spring Security 인증 구조 (0) | 2024.01.27 |
[JWT] Access Token과 Refresh Token이란? (0) | 2024.01.27 |