[Improvements] Prevent session creation when the request is coming from Token based Auth #12
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Dua tahun yang lalu aku sempat mengeksplorasi terkait authentication mechanism dan pencatatan session di framework yang digunakan pada Dicoding. Berikut adalah dokumentasi lengkapnya di kala itu :
https://www.notion.so/dicoding/Run-through-Auth-mechanism-in-current-Dicoding-Auth-Oauth-449ab29ee52c4ee7b669a42ac65b29e9
Intinya, setiap ada request yang masuk, entah itu melalui web browser atau API, sebuah session akan dicatat dengan flow sebagai berikut :
Session dicatat pada di Redis. Session ID dicatat pada Cookie, sehingga ketika tidak ada cookie dengan key laravel_session yang valid, maka akan regenerate terus menerus.
Inti dari pembahasan pada dokumen diatas adalah setiap kali ada request, session selalu dicatat ke session manager, tidak melihat apakah ini berasal dari session web maupun session dari API request.
Bayangkan, satu user bisa request API ratusan - ribuan kali, dan itu akan melakukan save new session pada redis.
Problem nya
Ketika request tersebut berasal dari sesi web, itu tidak menjadi masalah karena selalu mengirimkan Cookie ketika request. Sehingga cookie tersebut persisten, tidak perlu ada regeneration ketika tiap request.
Akan tetapi, hal ini tidak berlaku pada API request. Ketika sebuah request datang dari API, utamanya dari oauth, request tersebut tidak mengandung Cookie. Di mana, menurut flow diatas, maka framework akan melakukan save new session.
Solusinya
Dimulai dari laravel 5, Guard, yang menjadi landasan untuk manajemen sesi user pada laravel memisahkan jenis guard dari user request ke Token, Cookie, dan sebagainya. Untuk case Token, ia tidak ada session disitu.
Akan tetapi, upgrading laravel 5 untuk menikmati perubahan tersebut akan susah untuk upgradenya di mana kita telah melakukan beberapa extending feature. Maka opsi upgrade adalah opsi yang overkill.
Lantas, saya ketemu ide, bagaimana kalau sesi tersebut tidak di save, atau bahkan tidak dibuat saat request API, seperti ini :
File -> Middleware.php
Sehingga ketika request dengan API, maka flownya akan seperti ini :
Potensinya, issue session ghost ini hilang dan save beberapa workaround (memory, api calls) ketika handling request.
Solusi ini sudah dicoba pada request yang datang dari Dicoding Jobs API, dan works. Akan tetapi perlu further checking pada beberapa route existing.
Setelah penerapan ini, maka kita sudah tidak bisa memanfaatkan Cookie buat request API.
Link followup :
https://teams.microsoft.com/l/message/19:996de939b1b14eb0bc317ab2a6464ce7@thread.tacv2/1756000586635?tenantId=a266a087-622d-47cc-8c26-c15071fe3650&groupId=c9e1dd91-06b9-4afb-8082-f9874705b076&parentMessageId=1756000586635&teamName=Engineering&channelName=Hacking&createdTime=1756000586635