access tocken
을 클라이언트에게 전송access token
을 첨부해서 request를 서버에 전송함으로서 매번 로그인해도 되지 않도록 한다.단방향 해시 함수는 원본 메시지를 변환하여 암호화된 메시지인 다이제스트(digest)
를 생성한다. 원본 메시지를 알면 암호화된 메시지를 구하기는 쉽지만 암호화된 메시지로는 원본 메시지를 구할 수 없어서 단방향성(one-way)
라고 한다.
예를 들어, "test password"를 hash256이라는 해시 함수를 사용하면 0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e
값이 나온다.
만일 "test password2"를 hash256 해시 함수를 사용하면 d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb
값이 나온다. 실제 비밀번호는 비슷하지만 해시 함수 값은 완전히 다르다. 이러한 효과를 avalance라고 하는데 비밀번호 해시 값을 해킹하기 어렵게 만드는 하나의 요소이다.
Salting과 Key Stretching을 구현한 해시 함수 중 가장 널리 사용되는 것이 bcrypt이다. bcrypt는 처음부터 비밀번호를 단방향 암호화하기 위해 만들어진 해시함수이다.
유저가 로그인을 성공한 후에는 access token
이라고 하는 암호화된 유저 정보를 첨부해서 클라이언트에게 전송한다. 즉, 프론트에서 ID/PW를 서버(백엔드)로 넘겨주면 백엔드가 DB에서 ID/PW를 비교하고, 확인 후 맞으면 다시 프론트에게 access token
을 전달하는 것이다.
이 토큰은 클라이언트의 브라우저에 저장이 되어 보관되다가 마이페이지와 같이 인증이 필요한 곳에서 프론트가 다시 access token
을 백엔드에게 넘겨주면 백엔드는 유저를 확인하고 마이페이지에 해당하는 정보를 다시 전달하게 된다.
POST /auth HTTP/1.1
Host: localhost:5000
Content-Type: application/json
{
"username": "joe",
"password": "pass"
}
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E"
// access tocken은 위와 같이 알 수 없는 string으로 되어있다.
}
그러면 서버에서는 access token
을 복호화해서 해당 유저 정보를 얻게 된다. 복호화하여 얻은 유저 아이디를 통해 해당 유저가 누군지 알 수 있다.
이러한 절차의 목적은 해당 유저가 매번 로그인할 필요가 없도록 하는 것이다. access token
을 생성하는 방법에는 여러가지가 있으나 그 중 가장 널리 사용되는 기술 중 하나가 JWT이다. JWT는 말 그대로 유저 정보를 담은 JSON 데이터를 암호화해서 클라이언트와 서버 간에 주고 받는 것이다.
무거운 bcrypt를 사용할 필요없이 간단한 해시로 작동한다. 실제 아이디나 패스워드가 쿠키와 같은 클라이언트의 스토리지에 저장되지 않는다. 또한 토큰은 특정 서버에서만 적용될 수 있기 때문에 다른 사이트에서 다시 사용될 수 없다.
access token
을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한도 확인할 수 있다.access token
을 생성한다. access token
에는 유저 정보를 확인할 수 있는 정보가 들어가 있어야 한다. (예를 들어 user id)access token
을 첨부해서 보낸다.access token
을 복호화 한다.