본문 바로가기
Web

토큰을 사용한 인증과 인가

by Big Sun 2023. 7. 10.
728x90

https://rasony.tistory.com/148

 

토큰을 사용하는 이유

로그인을 세션으로 구현한다고 하면 주변에서 시선이 느껴지는 경험을 다들 해본 적이 있을 것이다. 그렇다면 쿠키와 세션으로 로그인을 구현하면 도대체 어떤 문제가 발생하길래 다들 이렇게

rasony.tistory.com

 

안녕하세요. 최근에 에코노베이션 동아리 주간발표 시간에 토큰을 활용한 인증과 인가에 대해서 발표하였습니다.
이에 대한 내용을 다시 한번 정리해보려고 합니다.

 

AccessToken과 RefreshToken이란?

 

AccessToken은 사용자가 자원에 접근하기 위해서 사용하는 토큰입니다. 그리고, RefreshToken은 기존의 사용자의 AccessToken이 만료되었을 때 재발급 받기 위해 사용됩니다.

 

즉, AccessToken을 사용해 사용자가 해당 자원에 접근해도 되는 사용자인 지를 확인하고, RefreshToken을 사용해 AcceeToken이 만료되었을 시 재발급을 받을 수 있습니다.

 

토큰은 stateless한 특징을 가졌기 때문에 서버가 토큰에 대한 제어권을 가지고 있지 않습니다. 따라서, 토큰이 탈취당하게 된다면 속수무책으로 당할 수밖에 없습니다.

이를 보완하고자 AccessToken의 유효 기간을 짧게 가져갈 수 있지만 완벽한 보안은 아닙니다.

 

 

AccessToken과 RefreshToken의 사용 예시로 제가 프로젝트에서 적용했던 방식입니다.

 

AccessToken과 RefreshToken의 매커니즘

 

 

먼저, 아이디와 비밀번호를 가지고 서버에 요청을 보냅니다.

 

 

 

성공시에는 위의 그림과 같이 AccessToken과 RefreshToken을 생성하여 반환합니다.

만약, 실패시에는 각자의 상황에 맞는 응답을 해줍니다.

 

 

 

 

로그인한 이후에는 자원을 요청할 때 HTTP Authorization Header에 AccessToken을  넣고 보냅니다.
서버는 요청을 받으면 AccessToken을 검증하여 이 토큰이 잘못된 토큰인 지 유효 기한은 지났는 지의 여부를 판단해 알맞은 응답을 내려줍니다.

만약, 올바른 토큰이라면 위의 그림과 같이 알맞은 응답을 반환합니다.

 

 

 

만약, 유효기간이 지난 토큰이라면 아래와같은 응답 메시지와 함께 RefreshToken을 사용해서 AccessToken을 재발행하라고 응답 메시지를 남겨준다.

 

 

재발행 요청시 AccessToken과 RefreshToken을 활용하여 서버가 올바른 토큰인 지, 유효 기한은 지나지 않았는 지 두 토큰의 짝이 맞는 지등의 여부를 판단해 맞다면 위와 같이 AccessToken과 RefreshToken을 재발행해준다.

 

이때, AccessToken은 HTTP Authorization 헤더에 담고, RefreshToken과 같은 경우에는 Set - Cookie 헤더에 담아서 요청과 응답한다.

 

 

왜 AccessToken은 HTTP Authorization 헤더에 담을까?

 

Authorization 헤더는 보호된 리소스에 대한 엑세스를 요청할 때 사용되는 헤더이기때문이다. (HTTP 즉 프로토콜, 규약이다.)

 

 

RefreshToken을 쿠키에 담아서 전송하는 이유는 무엇일까?

쿠키에 담아서 전송하는 얻을 수 있는 장점이 몇 가지 있습니다.

 

첫째로, 쿠키의 HTTP Only 옵션을 사용할 수 있다는 것입니다. 이 옵션을 활성화하면 javascript로 쿠키에 접근할 수 없게 되어 XSS 공격을 방지할 수 있습니다.

둘째로, Secure 옵션을 사용할 수 있다는 것입니다. 이 옵션을 활성화하면 쿠키를 HTTPS가 적용된 보안 연결에서만 전송하도록 제안하게 되어 HTTPS가 적용되지 않은 연결로 쿠키가 탈취당하는 일을 방지합니다.

 

 

그런데, 쿠키에 값을 담아서 보내면 CSRF 공격에 취약하지 않을까?

 

CSRF 공격은 정상적인 사용자가 의도치 않은 위조 요청을 보내는 것으로 "쿠키"에 담겨진 인증 정보를 사용합니다.

쿠키에 RefreshToken값이 있기 때문에 해커가 이를 사용해 악의적인 행동을 할 수가 있습니다.

그러나, RefreshToken을 사용하는데는 토큰을 재발급 받을 경우밖에 없습니다. 그러므로, 해당 API에서 이에 대응할 적절한 방법이 구상되어있다면 쿠키에 담아 보내는 것이 장점이 더 많다고 생각됩니다.

 

AccessToken 마저 쿠키에 담아버리면 CSRF 공격에 엄청 취약해집니다. 왜냐하면 AccessToken은 인증/인가에 필요한 모든 요청을 할 수 있기 때문입니다. 그래서 AccessToken은 쿠키에 담지 않습니다.

 

 

지금까지, 토큰을 사용한 인증과 인가 포스팅이었습니다.

 

감사합니다!!

728x90

'Web' 카테고리의 다른 글

DNS(Domain Name System)  (0) 2024.01.21
토큰을 사용하는 이유  (0) 2023.07.03
Postman에서 토큰 자동 설정하는 방법  (1) 2023.05.14
JWT에 대하여  (0) 2023.03.31
HTTP 란 무엇일까?  (0) 2022.11.14