서버 인증방식 종류에 대해 살펴보자. 더 불어 토큰인증방식에 사용되는 JWT도 간단하게 알아보자.
1. 세션/쿠키 인증방식
서버 측에서 사용자들의 정보를 기억한다.
사용자들의 정보를 기억하기 위해 세션을 사용한다. (메모리나 디스크 또는 데이터베이스 등을 이용. 보통 Redis를 많이 사용한다고 한다.)
flow
- 사용자 로그인
- 서버에서 계정정보 검증 후 사용자의 고유한 ID값을 부여하여 세션 저장소에 저장 후 매핑되는 세션 ID를 발행
- 사용자는 서버에서 발급받은 세션 ID를 쿠키에 저장한 후, 요청을 보낼 때 같이 전송
- 서버에서는 쿠키를 받아 세션 저장소에서 데이터를 검증 후 대응되는 정보를 가져옴
특징
- HTTP 요청 중 쿠키가 탈취당해도, 쿠키(세션 ID)는 의미가 있는 값이 아니기 때문에 보안상 안전하다고 생각할 수 있으나 세션 하이재킹 공격에 노출될 가능성이 있다.
- 해결책 : HTTPS 사용 혹은 세션에 유효기간을 넣어서 방지한다.
- 세션저장소를 사용한다.
- 대부분의 경우 메모리에 세션ID(정보)를 저장하게 되는데, 로그인 사용자가 늘어날 경우 RAM에 부하가 생길 가능성이 있다.
- 서버 확장을 위해 세션 클러스터링이 필요하다.
- 클라이언트의 상태를 유지하므로, Stateful 하다.
- 쿠키를 여러 도메인(CROS)에서 관리하는 것이 번거롭다.
2. 토큰기반 인증방식
인증받은 사용자들에게 토큰을 발급하고, 서버에 요청을 보낼 때 헤더에 토큰을 함께 보내 유효성 검사를 진행한다.
- 사용자 로그인
- 서버에서 계정정보를 검증 후 Access Token을 발급
- 사용자는 Access Token을 저장한 후, 서버에 요청을 할 때 Http 헤더에 해당 토큰을 함께 전송
- 서버에서 토큰을 검증하고, 요청에 응답
장점
- 상태를 유지하지 않으므로 Stateless하다. (서버 확장이나 유지/보수에 용이)
- 확장성이 뛰어나다. 토큰 기반으로 하는 다른 인증 시스템에 접근이 가능하다. (ex. facebook, google 로그인)
- 더 이상 쿠키를 전달하지 않으므로, 쿠키 사용에 의한 취약점이 사라진다.
- CORS 문제 해결
단점
- 토큰이 탈취될 경우 악의적인 사용자는 유효기간이 지나기 전까지 토큰을 사용하여 정보를 탈취할 수 있음(세션 방식은 세션을 삭제하면 그만)
- 해결책 : AccessToken 유효기간을 짧게 하고 Refresh Token을 발급하여 AccessToeken을 탈취당해도 상대적으로 피해를 최소화 시킨다.
JWT(Json Web Token)
토큰기반 방식에서 가장 많이 사용되는 것이 JWT(Json Web Token) 이다. 따라서 JWT에 대해서 알아보자.
JWT는 쉽게말하면 인증에 필요한 정보들을 암호화시킨 토큰을 말한다. 사용자는 JWT을 HTTP 헤더에 넣어 서버로 보내게 된다. (토큰 자체를 정보로 이용하는 Self-Contained 방식 이용)
JWT 구조
JWT는 Header, Payload, Verify Signature의 3 부분으로 이루어져 있으며, 각 부분은 Json 형태를 Base64 인코딩하여 표현되며, . 으로 구분되어 있다. (Header.Payload.VerifySignaure 이런식으로 표현된다.)
Header
Verfiy Signature를 해싱하기 위한 알고리즘을 지정
- typ : 타입
- alg : 해싱 알고리즘 종류
Paylaod
토큰에서 사용할 정보들이 들어간다. 클레임(Claim)이라고 부르는 정보의 조각이 들어간다. name/value 키 쌍으로 들어가있으며 자세한 내용은 구글링을 하자. (참고 : https://velopert.com/2389)
Verfiy Signature
토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드.
Header, Payload를 각각 Base64로 인코딩한 값을 합친 후, 비밀키로 해쉬를 합니다. 그 해쉬값을 Base64 인코딩하여 생성한다.
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload), secretKey
)
# 이렇게 해서 나온 해쉬 값을(hex) base64 인코딩하여 사용
'프로그래밍 노트 > WEB' 카테고리의 다른 글
[웹 사이트 최적화 기법] HTTP의 이해 (0) | 2020.03.16 |
---|---|
Timeout에 관한 정리 (0) | 2020.03.03 |
REST API 보안_인가(Authorization) (0) | 2019.06.07 |
REST API 보안_인증(Authentication) (0) | 2019.06.07 |
REST API 보안_1 (0) | 2019.05.30 |