2021년 9월 7일에 작성된 문서 입니다.
https 배운 내용을 정리했습니다.
토큰기반 인증 (Token-based Authentication)
1. 토큰기반 인증 : 클라이언트에서 인증 정보 보관하는 방법
토큰을 클라이언트에 저장해도 정말 괜찮은 걸까요? 여러분들은 클라이언트는 XSS, CSRF공격에 노출이 될 위험이 있으니 민감한 정보를 담고 있어서는 안된다는 것을 기억하실 것입니다. 그렇다면 "민감한 정보는 클라이언트에 담으면 안 된다면서, 인증에 사용되는걸 클라이언트에 담는다고?" 라는 의문이 드실 것 입니다.
- 토큰은 유저 정보를 암호화한 상태로 담을 수 있고, 암호화했기 때문에 클라이언트에 담을 수 있다.
2. JWT의 종류
- Access Token
- Refresh Token
- Access token: 보호된 정보들에 접근할 수 있는 권한부여에 사용
- 클라이언트가 처음 인증을 받게 될 때(로그인 시), access, refresh token 두가지를 다 받지만, 실제로 권한을 얻는 데 사용하는 토큰은 access token.
- Access token의 유효기간이 만료된다면 refresh token을 사용하여 새로운 access token을 발급.
- 이때, 유저는 다시 로그인할 필요가 없다.
3. JWT 구조

-
Header
어떤 종류의 토큰인지, 어떤 알고리즘으로 sign(암호화) 할지가 적혀있다.
- JSON Web Token 이라는 이름에 맞추어 JSON형태로 나온다.
{
"alg": "HS256",
"typ": "JWT"
}
// JSON 객체를 base64 방식으로 인코딩하면 JWT의 첫 번째 부분이 완성
-
Payload
Payload에는 정보가 담겨 있다.
- 어떤 정보에 접근 가능한지에 대한 권한을 담을 수도 있고, 사용자의 유저 이름 등 필요한 데이터는 이곳에 담아 암호화.
- 민감한 정보는 되도록 담지 않는 것이 좋다.
{
"sub": "someInformation",
"name": "phillip",
"iat": 151623391
}
//JSON 객체를 base64로 인코딩하면 JWT의 두 번째 블록이 완성
-
Signature
- base64로 인코딩된 첫번째, 그리고 두번째 부분이 완성 되었다면, 원하는 비밀 키(암호화에 추가할 salt)를 사용하여 암호화.
- base64 인코딩을 한 값은 누구나 쉽게 디코딩할 수 있지만, 서버에서 사용하고 있는 비밀키를 보유한게 아니라면 해독하기 어렵다.
HMACSHA256(base64UrlEncode(header) + '.' +
base64UrlEncode(payload), secret);
//HMAC SHA256 알고리즘을 사용한다면
//signature는 아래와 같은 방식으로 생성
4. JWT 사용 예시
JWT는 권한 부여에 굉장히 유용.
새로 다운받은 A라는 앱이 Gmail과 연동되어 이메일을 읽어와야 한다고 생각해 봅시다. 유저는
- Gmail 인증서버에 로그인정보(아이디, 비밀번호)를 제공한다
- 성공적으로 인증시 JWT 를 발급받는다
- A앱은 JWT를 사용해 해당 유저의 Gmail 이메일을 읽거나 사용할 수 있다
5. 토큰기반 인증 절차
- 클라이언트가 서버에 아이디/비밀번호를 담아 로그인 요청을 보냄.
- 아이디/비밀번호가 일치하는지 확인하고, 클라이언트에게 보낼 암호화된 토큰을 생성.
- access/refresh 토큰 모두 생성
- 토큰에 담길 정보(payload)는 유저를 식별할 정보, 권한이 부여된 카테고리(사진, 연락처, 기타등등)이 될 수 있다.
- 토큰을 클라이언트에게 보내주면, 클라이언트는 토큰을 저장한다.
- 저장하는 위치는 local storage, cookie, react의 state 등 다양하다.
- 클라이언트가 HTTP 헤더(authorization 헤더)에 토큰을 담아 보낸다.
- 서버는 토큰을 해독하여
"아 우리가 발급해준 토큰이 맞네!" 라는 판단이 될 경우, 클라이언트의 요청을 처리한 후 응답을 보내준다.

6. 토큰기반 인증의 장점
- Statelessness & Scalability (무상태성 & 확장성)
- 서버는 클라이언트에 대한 정보를 저장할 필요 없다 (토큰 해독 되는지만 판단)
- 클라이언트는 새로운 요청을 보낼때마다 토큰을 헤더에 포함시키면 됨
- 안전하다
암호화 한 토큰을 사용하고, 암호화 키를 노출 할 필요가 없어 안전
- 어디서나 생성 가능하다
- 토큰을 확인하는 서버가 토큰을 만들어야 하는 법이 없다
- 토큰 생성용 서버를 만들거나, 다른 회사에서 토큰관련 작업을 맡기는 것 등 다양한 활용이 가능
- 권한 부여에 용이하다
- 토큰의 payload(내용물) 안에 어떤 정보에 접근 가능한지 정할 수 있다
- ex) 서비스의 사진과 연락처 사용권한만 부여
Written with StackEdit.