Notice
Recent Posts
Recent Comments
Link
Ssul's Blog
인증, 로그인 정리(쿠키, 세션, 토큰) 본문
인증의 3가지 종류
- 쿠키: 클라이언트(브라우저)에 쿠키값이 저장
- 세션: 세션값이 서버에 저장되는 것
- 토큰: 서버 호출시 토큰 전달, 서버에 저장된 토큰정보로 인증 확인
쿠키인증 프로세스
- 클라이언트가 request(id & pw) → 서버가 로그인 체크하고 성공이면 → 서버에서 쿠키값 생성
- 서버에서 클라이언트로 쿠키값 보냄(response.headers에 set-cookie 값을 보냄(Set-Cookie: <cookie-name>=<cookie-value>))
- 클라이언트는 response.headers에 있는 쿠키를 브라우저에 쿠키값 저장(<cookie-name>=<cookie-value>
- 앞으로 서버 소통시 브라우저가 쿠키값을 가지고 있어서 소통가능해짐
세션인증 프로세스
- 클라이언트가 request(id & pw) → 서버가 로그인 체크하고 성공이면 → 인증정보 생성하여 세션 저장소에 저장
- 유저에 session_id부여 -> 클라이언트에게 전달(response.headers.Set-Cookie:session_id=x2yce2xxxxxxxxxxxx)
- 유저는 부여받은 sessionid를 가지고, 소통
- 브라우져가 닫히면, 세션이 삭제됨
토큰인증 프로세스
- 클라이언트가 request(id & pw) → 서버가 로그인 체크하고 성공이면 → 서버에 토큰 생성
- 토큰을 클라이언트한테 보냄 → 클라이언트는 토큰을 저장해두었다
- 다음부터 해더에 토큰넣어서 소통(Authorization: “Bearer ${JWT_TOKEN}”)
- 서버에 있는 토큰정보랑 비교해서 소통허용
장고에서 로그인 사용 예시
1. 프론트에서 id, pw입력해서 백엔드 로그인 api 호출
2. 백엔드에서 request에 들어있는 id, pw 확인하고, 있으면 user객체 가져옴
def authorize_with_email(request: HttpRequest):
password = request.data.get("password")
email = request.data.get("email")
username = hashlib.md5(email.encode()).hexdigest()
# 자격증명이 유효하면 user객체생성
user = authenticate(username=username, password=password)
if user is None:
raise NotFound(_("email or password is wrong"))
# 자격증명이 유효하여, 장고의 세션에 저장(사실은 우리가 만든 함수로 이동)
login(request, user)
return Response({"msg": 'ok',
"accessToken": request.data['accessToken']})
3. 가져온 user객체로 login함수 호출: djanog auth에 있는 로그인 함수로 로그인 진행 후, 유저고유의 토큰을 생성하여 db저장
def login(request: HttpRequest, user: User):
# 로그인 후 -> 세션에 저장
django_login(request, user)
# 토큰 있는지 보고, 없으면 토큰생성
token = Token.objects.filter(user_id=user.id).first()
if not token:
token = Token(user_id=user.id)
token.save()
request.data['accessToken'] = token.key
'dev > 까먹지마' 카테고리의 다른 글
도커(Docker)에서 쿠버네티스(k8s)까지: #1. Docker이해하기 (0) | 2024.05.23 |
---|---|
python 맨날 까먹는 *arg **kwarg 이해하기 (0) | 2023.04.17 |
django orm 주요 명령어 정리(exclude, values, annotate, order_by, date__range) (0) | 2023.01.11 |
생성자(__init__), self 이해하기 (0) | 2023.01.03 |
Django REST Framework 구조이해 (0) | 2022.10.06 |