티스토리 뷰
1. 로그인을 유지시킬 방법
우리는 클라이언트와 서버가 통신할 때 HTTP 프로토콜을 사용한다는 것은 알 것이다.
혹시 모른다면 HTTP & HTTPS 포스팅을 보고 오는 것을 추천한다.
HTTP 프로토콜은 크게 두 가지 특징이 있다.
1-1. 비 연결성
서버와 요청을 하고 요청한 데이터를 서버가 받은 다음 그에 대응하는 응답을 보낸다. 이게 한번 통신이 일어나는 과정인데,
서버가 응답을 하고 나면 클라이언트와 연결이 끊어진다. 이것을 비연결성 이라고 한다.
1-2. 무 상태성
아까 비 연결성으로 인해 한번 통신을 하고 나면 클라이언트와 서버가 연결을 끊는다고 했다.
그럼 이전에 통신을 했을 때 주고 받았던 상태 정보가 남아있지 않아 새롭게 갱신을 시켜주어야 한다.
이건 생각보다 심각한 문제다. 만약 의류 온라인 사이트를 이용한다고 가정해보자.
옷을 장바구니에 담을 때 로그인을 했다. 그리고 장바구니를 보려고 하자 또 로그인을 하라고 한다. 주문할 때도 로그인을 하라고 한다. 과연 누가 이 사이트를 좋아하고 이용할 수 있을까.
이러한 특징들 때문에 로그인을 유지시키는 방법을 구현해야 하는데, 그 방법 중 현재 가장 좋은 방법이 토큰방식이다.
그럼 토큰 방식이 무엇인지 알아보자.
2. 토큰 방식
1. 사용자가 로그인 페이지에 아이디와 비밀번호를 입력합니다.(로그인을 함)
2. 아이디와 비밀번호를 받은 서버는 회원가입한 사용자인지 검증한다. (검증 과정은 SpringSecurity 동작과정에 자세하게 나와있다)
3. 검증된 사용자라는 것이 확인되었다면 서버에서 사용자에게 토큰을 발급해준다.
4. 사용자는 받은 토큰을 저장해두었다가, 요청을 할 때마다 토큰을 함께 서버로 요청한다. (토큰은 헤더에 넣어서 보낸다)
5. 서버는 토큰을 검증하고 요청에 응답한다.
이 토큰방식을 구현할 때 사용하는 것이 바로 JWT이다.
JWT에 대해서 알아보자.
3. 어떤 상황에서 JWT를 사용할까 ?
JWT가 뭔지는 설명했다. 그럼 어떤 상황에 JWT를 사용할까 ?
- 회원 인증
회원을 인증하는 것은 JWT를 사용하는 대표적인 예시다. 서버에서는 유저가 로그인되어있는지 신경쓸 필요가 없고, 유저가 요청할 때마다 보내는 토큰만 인증하면 되니 세션관리가 필요없어 서버 자원을 많이 아낄 수 있다.
- 정보 교류
클라이언트와 서버 사이에서 안전하게 정보를 교류할 수 있다. 그 이유는 맨 처음에 인증된 사용자에게 보내는 토큰에 담겨있는 signature 때문이다. 이 signature 때문에 요청을 보낸 이가 바뀌었는지, 정보가 도중에 조작되지는 않았는지 검증할 수 있다.
4. JWT 구조
Header, payload, signature로 나뉠 수 있다. 그럼 하나하나 어떤 데이터를 담고 있는지 알아보자.
4-1. Header
Header는 토큰의 타입, 해싱 알고리즘 종류, 두가지 정보를 가지고 있다.
JSON 형식으로 담겨져 있다.
{
"typ" : "JWT",
"alg" : "HS256"
}
4-2. payload
payload는 토큰에 담을 정보가 들어있다. 담길 정보는 3가지가 있는데, 각각을 클레임(claim)이라 부른다.
3가지는 다음과 같다.
- 등록된 클레임
- 공개 클레임
- 비공개 클레임
우리는 클레임을 다 알 필요가 없기 때문에 가장 중요하다고 생각되는 등록된 클레임을 알아보자.
등록된 클레임에는 아래와 같이 토큰에 대한 정보가 나와있다.
4-3. signature
간단하다. 앞서 말했던 헤더를 인코딩한 값과 페이로드를 인코딩한 값을 합친 후 비밀키로 암호화한 것이다.
개인키에 대해서 알고 싶으면 HTTP & HTTPS를 보고 오는 것을 추천드린다.
그럼 다음 포스팅에서 JWT를 이용하여 로그인 인증과 로그인 유지를 구현해보도록 하겠다.
'SpringBoot' 카테고리의 다른 글
토큰을 이용한 로그인 동작 과정 (0) | 2022.07.26 |
---|---|
회원가입, 로그인 및 토큰 발급 구현하기 (0) | 2022.07.19 |
Spring Security 동작 원리 (4) | 2022.07.17 |
AOP 실무 사례 알아보기 (0) | 2022.07.09 |
AOP 개념과 용어 정리 (0) | 2022.07.09 |
- Total
- Today
- Yesterday